Download - Lecture 6:
![Page 1: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/1.jpg)
Lecture 6:
Advanced GUI Controls
![Page 2: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/2.jpg)
Up to now we have used simple controls such as buttons and textboxes. Now we will review some interactive (e.g. dialog) controls available to the C# applications developer.
OpenFileDialog and SaveFileDialog and the associated controls interact with the user to determine the location and name of a file to read or write. These common dialogs are not for the purpose of actually reading or writing files.
Other advanced controls we will cover here include MessageBoxes with decisions, the Calender, ListBoxes, ComboBoxes, and TabControls.
In addition, we continue to review methods for reading and writing text files using StreamReader and StreamWriter.
This will be our first look at Multiple Document Interfaces (MDI's). The demo program WidgetDemo is an example of an MDI program that also happens to illustrate the use of several GUI controls.
Topics
![Page 3: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/3.jpg)
![Page 4: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/4.jpg)
![Page 5: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/5.jpg)
![Page 6: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/6.jpg)
![Page 7: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/7.jpg)
100 1 2 3 4 5 6 7 6 91 2 3 4 5 6 7 8 9 02 3 4 5 6 7 8 9 0 13 4 5 6 7 8 9 0 1 24 5 6 7 8 9 0 1 2 35 6 7 8 9 0 1 2 3 46 7 8 9 0 1 2 3 4 57 8 9 0 1 2 3 4 5 68 9 0 1 2 3 4 5 6 79 0 1 2 3 4 5 6 7 8
array.txt
Reading a Textfile
In the example code ReadTextArray a 10x10 array of integers named array.txt is read and loaded into a two-dimensional array.
![Page 8: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/8.jpg)
string fname = ""; string textline = ""; fname = txtFilename.Text; int j; try { TextReader tr = new StreamReader(fname); n = Convert.ToInt32(tr.ReadLine()); txtDisplay.Text = Convert.ToString(n) + "\r\n"; W = new int[n,n]; for (int i = 0; i < n; i++) { textline = tr.ReadLine(); txtDisplay.Text = txtDisplay.Text + " " + textline + "\r\n"; j = 0; foreach (string subString in textline.Split(' ')) { if (subString != "") { W[i,j] = Int32.Parse(subString); j += 1; } } } tr.Close(); } catch { txtFilename.Text = "no such file"; }
Reading an Array of Integers
![Page 9: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/9.jpg)
private void btnCompute_Click(object sender, EventArgs e) { int sum; string str = ""; txtDisplay.Text = ""; txtDisplay.Text += "\r\n"; for (int i=0; i < n; i++) { sum = 0; for (int j=0; j < n; j++) { sum += W[i, j]; } str += "Row " + Convert.ToString(i) + " = " + Convert.ToString(sum) + "\r\n"; } txtDisplay.Text += str; }
Using the Array
![Page 10: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/10.jpg)
100 1 2 3 4 5 6 7 6 91 2 3 4 5 6 7 8 9 02 3 4 5 6 7 8 9 0 13 4 5 6 7 8 9 0 1 24 5 6 7 8 9 0 1 2 35 6 7 8 9 0 1 2 3 46 7 8 9 0 1 2 3 4 57 8 9 0 1 2 3 4 5 6 8 9 0 1 2 3 4 5 6 79 0 1 2 3 4 5 6 7 8
array.txt
The Benefit of Checking for Empty String
![Page 11: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/11.jpg)
using System.IO;::
private void OnFileOpen(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "text files (*.txt)|*.txt"; dialog.ShowDialog(); filename = dialog.FileName; OpenFile(); }
private void OnFileSaveAs(object sender, EventArgs e) { if (dlgSaveFile.ShowDialog() == DialogResult.OK) { filename = dlgSaveFile.FileName; SaveFile(); } }
The Purpose of Common File Dialogs:to retreive a path and filename
![Page 12: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/12.jpg)
try { printDocument.Print(); } catch (InvalidPrinterException ex) { MessageBox.Show(ex.Message, "Print Ticket", MessageBoxButtons.OK, MessageBoxIcon.Error); }
::
private void printDocument_PrintPage(object sender, PrintPageEventArgs e) { Bitmap center = new Bitmap("ticket_header_center.jpg"); string line = "";
line = txtFirst.Text + " " + txtLast.Text; e.Graphics.DrawString(line, new Font("Arial", 12),Brushes.Black, 20, 240); line = txtStreet.Text; e.Graphics.DrawString(line, new Font("Arial", 12), Brushes.Black, 20, 260); line = txtCity.Text + ", " + txtState.Text + " " + txtZip.Text; e.Graphics.DrawString(line, new Font("Arial", 12), Brushes.Black, 20, 280); e.Graphics.DrawImage(center,275, 20); }
Printing a Document with Images and Text
![Page 13: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/13.jpg)
The Toolbox Widget Demo
The Widget Demo is an example of an MDI application
Each demo is presented as a Child Form under the Widget menu.
![Page 14: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/14.jpg)
![Page 15: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/15.jpg)
![Page 16: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/16.jpg)
a new mouseChild form is created here and isdisplayed inside the widgetMain form.
establishes widgetMain as the MdiParent of mouseChild
![Page 17: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/17.jpg)
Mouse Demo
private Point mpt;
public mouseChild(WidgetDemo.widgetMain parent){ InitializeComponent(); this.MdiParent = parent;}
private void mouseChild_MouseMove(object sender, MouseEventArgs e){ Point lpt = new Point(); mpt = MousePosition; tbxXpos.Text = Convert.ToString(mpt.X); tbxYpos.Text = Convert.ToString(mpt.Y); Form mschild = this.ActiveMdiChild; lpt = this.Location; tbxrelXpos.Text = Convert.ToString(mpt.X - lpt.X - 6); tbxrelYpos.Text = Convert.ToString(mpt.Y - lpt.Y - 74);}
private void mouseChild_MouseDown(object sender, MouseEventArgs e){ MessageBox.Show(Convert.ToString(e.Button) + " button Pressed");}
![Page 18: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/18.jpg)
public partial class msgBoxChild : Form{ private MessageBoxButtons buttonType = MessageBoxButtons.OK; private MessageBoxIcon iconType = MessageBoxIcon.Exclamation;
public msgBoxChild(WidgetDemo.widgetMain parent) { InitializeComponent(); this.MdiParent = parent; rbExclamation.Checked = true; rb_OK.Checked = true; }
private void btnDisplayMsgBox_Click(object sender, EventArgs e) { if (rb_OK.Checked) buttonType = MessageBoxButtons.OK; if (rb_OKCancel.Checked) buttonType = MessageBoxButtons.OKCancel; if (rb_AbortRetryIgnore.Checked) buttonType = MessageBoxButtons.AbortRetryIgnore;
::
if (rbQuestion.Checked) iconType = MessageBoxIcon.Question; if (rbStop.Checked) iconType = MessageBoxIcon.Stop; if (rbWarning.Checked) iconType = MessageBoxIcon.Warning; DialogResult result = MessageBox.Show("Your message goes here.", "Custom MessageBox", buttonType, iconType); }}
messageBox Demo
![Page 19: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/19.jpg)
private void newToolStripButton_Click(object sender, EventArgs e){ picBox.Image = null; this.Width = 200; this.Height = 200;}
private void openToolStripButton_Click(object sender, EventArgs e){ int minWidth = 100; int minHeight = 50;
string fileName = ""; OpenFileDialog dlg = new OpenFileDialog(); if (dlg.ShowDialog() == DialogResult.OK) { fileName = dlg.FileName; Bitmap img = new Bitmap(fileName); picBox.Image = img; if (img.Width + 10 > minWidth) this.Width = img.Width + 10; else this.Width = minWidth; if (img.Height + 60 > minHeight) this.Height = img.Height + 60; else this.Height = minHeight; }}
pictureBox Demo
![Page 20: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/20.jpg)
private DateTime dtobj = new DateTime();
public calChild(WidgetDemo.widgetMain parent){ InitializeComponent(); this.MdiParent = parent;}
private void monthCalendar_MouseUp(object sender, MouseEventArgs e){ dtobj = monthCalendar.SelectionStart; tbxDay.Text = Convert.ToString(dtobj.Day); tbxMonth.Text = Convert.ToString(dtobj.Month); tbxYear.Text = Convert.ToString(dtobj.Year); tbxDate.Text = Convert.ToString(dtobj.Date); tbxDayOfYear.Text = Convert.ToString(dtobj.DayOfYear); tbxDayOfWeek.Text = Convert.ToString(dtobj.DayOfWeek);}
monthCalendar Demo
![Page 21: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/21.jpg)
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){ linkLabel1.LinkVisited = true; System.Diagnostics.Process.Start(@"C:\");}
private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){ linkLabel2.LinkVisited = true; System.Diagnostics.Process.Start("notepad");}
private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){ linkLabel3.LinkVisited = true; System.Diagnostics.Process.Start("http://www.google.com");}
linkLabel Demo
![Page 22: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/22.jpg)
private void listBoxFavs_MouseUp(object sender, MouseEventArgs e){ rtbxSelected.Text = ""; foreach (string item in listBoxFavs.SelectedItems) { rtbxSelected.Text += item + "\n"; }}
listBox Demo
![Page 23: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/23.jpg)
comboBox Demo
![Page 24: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/24.jpg)
private string[,] countrydata = new string[237, 3];
private void load_country_data(){ string textline; int colnum; int rownum = 0;
StreamReader tr = new StreamReader("country_data.txt"); do { textline = tr.ReadLine(); colnum = 0; foreach (string str in textline.Split('\t')) { if (str != "xxx") { countrydata[rownum, colnum] = str; colnum += 1; } else break; } rownum += 1; } while (textline != "xxx"); tr.Close();}public comboChild(WidgetDemo.widgetMain parent){ InitializeComponent(); this.MdiParent = parent; load_country_data(); comboCountryList.Text = "Select a Country";}
Reading the country_data File
![Page 25: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/25.jpg)
private void comboCountryList_SelectedIndexChanged(object sender, EventArgs e){ int index = -1; try { index = comboCountryList.SelectedIndex; rtbDisplay.Text = "Selected index = " + Convert.ToString(index) + "\n"; rtbDisplay.Text += "Population = " + countrydata[index,2] + "\n"; rtbDisplay.Text += "Rank by Population = " + countrydata[index,1] + "\n"; rtbDisplay.Text += "Gross Domestic Product = " + countrydata[index,0] + "\n"; } catch { comboCountryList.Text = "Select a Country"; }}
ComboBox SelectedIndexChange Event
![Page 26: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/26.jpg)
tabControl Demo
public partial class tabChild : Form { private int[] face = new int[4] { 0, 0, 0, 0 }; private Bitmap[] head = new Bitmap[8]; private Bitmap[] eyes = new Bitmap[8]; private Bitmap[] nose = new Bitmap[8]; private Bitmap[] chin = new Bitmap[8]; private bool in_color = true;
![Page 27: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/27.jpg)
public void load_images(){ string[] person = new string[] {"churchill", "eastwood", "henryVIII", "joker", "mona", "monroe", "rubens", "vangogh"}; string filename;
for (int i = 0; i < 8; i++) { filename = person[i] + "_01.jpg"; head[i] = new Bitmap(filename); filename = person[i] + "_02.jpg"; eyes[i] = new Bitmap(filename); filename = person[i] + "_03.jpg"; nose[i] = new Bitmap(filename); filename = person[i] + "_04.jpg"; chin[i] = new Bitmap(filename); }}
tabControl Demo Image Load
![Page 28: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/28.jpg)
public void show_face(){ if (in_color) { picBoxHead.Image = head[face[0]]; picBoxEyes.Image = eyes[face[1]]; picBoxNose.Image = nose[face[2]]; picBoxChin.Image = chin[face[3]]; } else { Bitmap img0 = new Bitmap(head[face[0]]); Grayscale(ref img0); picBoxHead.Image = img0; Bitmap img1 = new Bitmap(eyes[face[1]]); Grayscale(ref img1); picBoxEyes.Image = img1; Bitmap img2 = new Bitmap(nose[face[2]]); Grayscale(ref img2); picBoxNose.Image = img2; Bitmap img3 = new Bitmap(chin[face[3]]); Grayscale(ref img3); picBoxChin.Image = img3; }}
tabControl Demo show_face( )
![Page 29: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/29.jpg)
private void btnDisplay_Click(object sender, EventArgs e) { if (rbChurchill_01.Checked) face[0] = 0; if (rbEastwood_01.Checked) face[0] = 1; if (rbHenry_01.Checked) face[0] = 2; if (rbJoker_01.Checked) face[0] = 3; if (rbMona_01.Checked) face[0] = 4; if (rbMonroe_01.Checked) face[0] = 5; if (rbRubens_01.Checked) face[0] = 6; if (rbVanGogh_01.Checked) face[0] = 7; if (rbChurchill_02.Checked) face[1] = 0; if (rbEastwood_02.Checked) face[1] = 1; if (rbHenry_02.Checked) face[1] = 2; if (rbJoker_02.Checked) face[1] = 3; if (rbMona_02.Checked) face[1] = 4; if (rbMonroe_02.Checked) face[1] = 5; if (rbRubens_02.Checked) face[1] = 6; if (rbVanGogh_02.Checked) face[1] = 7; if (rbChurchill_03.Checked) face[2] = 0; if (rbEastwood_03.Checked) face[2] = 1; if (rbHenry_03.Checked) face[2] = 2; if (rbJoker_03.Checked) face[2] = 3; if (rbMona_03.Checked) face[2] = 4; if (rbMonroe_03.Checked) face[2] = 5; if (rbRubens_03.Checked) face[2] = 6; if (rbVanGogh_03.Checked) face[2] = 7; if (rbChurchill_04.Checked) face[3] = 0; if (rbEastwood_04.Checked) face[3] = 1; if (rbHenry_04.Checked) face[3] = 2; if (rbJoker_04.Checked) face[3] = 3; if (rbMona_04.Checked) face[3] = 4; if (rbMonroe_04.Checked) face[3] = 5; if (rbRubens_04.Checked) face[3] = 6; if (rbVanGogh_04.Checked) face[3] = 7; show_face(); }
There is a better way todeal with large numbersof Widget properties...
for example,
How would you create anarray of radioButtons?
Selecting face for Display
![Page 30: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/30.jpg)
public partial class gdiChild : Form { protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; Random rnd = new Random(); Pen MyPen = new Pen(Color.Red); Point a = new Point(50, 50); Point b = new Point(250, 250); for (int i = 0; i < 100; i++) { a.X = rnd.Next(10, this.Width - 30); a.Y = rnd.Next(10, this.Height - 60); b.X = rnd.Next(10, this.Width - 30); b.Y = rnd.Next(10, this.Height - 60); MyPen.Color = Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)); g.DrawLine(MyPen, a, b); } }
GDI+ Drawing Demo
onPaint is used for cleaning up windows aftermove and resize events...not for drawing
![Page 31: Lecture 6:](https://reader036.vdocuments.us/reader036/viewer/2022062804/568149bb550346895db6f327/html5/thumbnails/31.jpg)
private void PaintThis() { Graphics g = pictureBox1.CreateGraphics(); Random rnd = new Random(); Pen MyPen = new Pen(Color.White); g.Clear(Color.White); Point a = new Point(50, 50); Point b = new Point(250, 250); for (int i = 0; i < 100; i++) { a.X = rnd.Next(10, this.Width - 30); a.Y = rnd.Next(10, this.Height - 60); b.X = rnd.Next(10, this.Width - 30); b.Y = rnd.Next(10, this.Height - 60); MyPen.Color = Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)); g.DrawLine(MyPen, a, b); }
gphChild Improves Drawing with GDI+
build your own methodsfor drawing. This method is calledwith a click-event for the picturebox
no auto-draw implemented