Оформление интерфейса
А теперь сделаем небольшую передышку и поговорим об оформительских средствах приложений.
Задача темы: изучить методику и получить навыки использования оформительских средств в разработках
Разработка: Приложение "Как я живу?" для оценки распределения своего личного времени
Состав выполняемых функций:
- Файловые операции: нет
- Алгоритмы: вычисление структуры распределения личного времени по 10 позициям
- Информационно-справочные: О программе
Наращивание функциональности не предусматривается.
Защита данных – только от неквалифицированных действий пользователя.
В качестве входных данных используются программные данные с начальной структурой затрат личного времени. Выходные данные программы – графическое отображение результатов в виде гистограммы структуры данных для SmartDevice
Шаг 1. Разработка графического интерфейса
Используются две формы – одна для ввода данных, другая – для вывода. Вторая форма (добавьте в проект) предназначена для вывода диаграммы со структурой распределения личного времени и не содержит никаких элементов, так как оформляется программно. Единственное предусмотренное свойство формы Text = Вот так и живу!
Первая форма содержит 10 надписей: Работа, Учеба, Культурный отдых, Спорт, Шопинг, Хобби, Безделье, Любовь, Еда, Сон; кнопку "Очистить" и 10 полей, со следующими свойствами – таблица 13.1.
Примерный дизайн формы показан на рис.13.1
Из невидимых элементов – главное меню с опциями "Файл" и "Диаграмма". В списке опций "Файл" можно предусмотреть "Открыть", "Сохранить как" и "Выход" - процедуры уже рассматривались выше и могут быть созданы самостоятельно. Только не забудьте добавить элементы диалогов открытия и записи файлов.
Свойство BackColor | Свойство Text |
---|---|
Lime | 18 |
255; 192; 128 | 16 |
192; 0; 0 | 14 |
192; 0; 0 | 12 |
Blue | 10 |
128; 255; 255 | 8 |
128; 255; 128 | 6 |
Yellow | 4 |
255; 128; 0 | 2 |
Red | 10 |
Шаг 2. Добавляем библиотеки
Для Form1:
using System; using System.Drawing; using System.Collections; using System.Windows.Forms; using System.Data; // добавляем собственную библиотеку (Add Reference -> Project) using DigitValidateDLL; using System.ComponentModel; // для графики /*добавляем, если есть намерение самостоятельно разработать процедуры открытия, загрузки и записи исходных данных файлов диаграмм */ using System.IO; using System.Xml; Для Form2: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms;
Шаг 3. Добавляем переменные public class Form1 : System.Windows.Forms.Form
// объявляем глобальную переменную для использования в обоих классах public static string DigitValidate="0"; // добавляем массив переменных для данных диаграммы public static int[] My_Life=new int[10];
Шаг 4. Создаем функцию проверки цифровых значений всех техстбоксов
void ValidaTextBox() { foreach (Control NT in this.Controls) if (NT is TextBox) if (NT.Text=="") {// проверка пустых значений NT.Text="0"; } foreach (Control NT in this.Controls) if (NT is TextBox) {// проверка цифр текстбокса DigitValidate =NT.Text; // подключаем библиотеку DigitValidateDLL.Class1 DVL=new DigitValidateDLL.Class1(); if (DVL.ReturnString(DigitValidate)=="Ошибка") { NT.Text="0"; } } this.textBox10.Text="0"; // обнуляем сон // ограничение 50 % для каждого текстбокса foreach (Control NT in this.Controls) if (NT is TextBox) { if (int.Parse(NT.Text)>=50) { NT.Text="50"; } } // ограничение 100 % для суммы текстбоксов int maxNT=0; foreach (Control NT in this.Controls) if (NT is TextBox) { if (maxNT+int.Parse(NT.Text)>=100) { NT.Text=((100-maxNT).ToString()); maxNT=100; } else { maxNT=maxNT+int.Parse(NT.Text); } } // Вывчисляем сон, если сумма меньше 100 maxNT=0; foreach (Control NT in this.Controls) if (NT is TextBox) { maxNT=maxNT+int.Parse(NT.Text); } if (maxNT<=100) { this.textBox10.Text=(100-maxNT).ToString(); } }
Шаг 5. Создаем процедуры вызова функции проверки при кликании каждого из техтбоксов
private void textBox1_TextChanged_1(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox2_TextChanged_2(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox3_TextChanged(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox4_TextChanged(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox5_TextChanged(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox6_TextChanged(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox7_TextChanged(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox8_TextChanged(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox9_TextChanged(object sender, System.EventArgs e) { ValidaTextBox(); } private void textBox10_TextChanged(object sender, System.EventArgs e) { // кроме десятого, так как оно результирующее }
Шаг 6. Офрмляем дизайн Form1
Для того, чтобы программно раскрасить форму нужно в свойствах событий Form1 Paint написать имя вызываемого метода – OnPaint, для которого пишем процедуру:
private void OnPaint (object sender, System.Windows.Forms.PaintEventArgs e) { this.CreateGraphics();// создаем графический объект Graphics g = e.Graphics; SolidBrush brush = new SolidBrush(Color.Green); Pen pen = new Pen(Color.Blue); // красим в голубой цвет g.DrawRectangle(pen,5,5,ClientRectangle.Width - 10, ClientRectangle.Height - 10); // рисуем рамочку формы }
Шаг 7. Создаем диаграмму в Form2
Также как и в Form1, загрузке графики предшествует определение имени вызываемого события, кстати, тоже OnPaint:
private void OnPaint (object sender, System.Windows.Forms.PaintEventArgs e) { // считываем значения this.CreateGraphics(); Graphics g = e.Graphics; SolidBrush brush = new SolidBrush(Color.Red); SolidBrush brush1 = new SolidBrush(Color.Orange); SolidBrush brush2 = new SolidBrush(Color.Yellow); SolidBrush brush3 = new SolidBrush(Color.Green); SolidBrush brush4 = new SolidBrush(Color.Blue); SolidBrush brush5 = new SolidBrush(Color.DarkBlue); SolidBrush brush6 = new SolidBrush(Color.DarkViolet); SolidBrush brush7 = new SolidBrush(Color.DarkRed); SolidBrush brush8 = new SolidBrush(Color.DarkOrange); SolidBrush brush9 = new SolidBrush(Color.Olive); // вычисляем высоту графика и 10 на нижнюю границу int My_High=ClientRectangle.Height-10; Pen pen = new Pen(Color.Blue); Font font = new Font("Arial",10,0); g.DrawString(Form1.My_Life[0].ToString()+" - сон",font,brush,130,190); g.DrawString(Form1.My_Life[1].ToString()+" - еда",font,brush1,130,170); g.DrawString(Form1.My_Life[2].ToString()+" - любовь",font,brush2,130,150); g.DrawString(Form1.My_Life[3].ToString()+" - безделье",font,brush3,130,130); g.DrawString(Form1.My_Life[4].ToString()+" - хобби",font,brush4,130,110); g.DrawString(Form1.My_Life[5].ToString()+" - шопинг",font,brush5,130,90); g.DrawString(Form1.My_Life[6].ToString()+" - спорт",font,brush6,130,70); g.DrawString(Form1.My_Life[7].ToString()+" - культпросвет", font, brush7, 130,50); g.DrawString(Form1.My_Life[8].ToString()+" - учеба",font,brush8,130,30); g.DrawString(Form1.My_Life[9].ToString()+" - работа",font,brush9,130,10); Font My_font = new Font("Arial",15,0); g.DrawString("100 % !",My_font,brush7,140,220); // Рамка g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height-10); g.FillRectangle(brush,5,5,ClientRectangle.Width/2, ClientRectangle.Height-10); g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- Form1.My_Life[0]*My_High/100); g.FillRectangle(brush1,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- Form1.My_Life[0]*My_High/100); // 2 Нижняя полоса g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- (Form1.My_Life[0]+Form1.My_Life[1])*My_High/100); g.FillRectangle(brush2,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1])*My_High/100); // 3 Нижняя полоса g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2])*My_High/100); g.FillRectangle(brush3,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2])*My_High/100); // 4 Нижняя полоса g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3])*My_High/100); g.FillRectangle(brush4,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3])*My_High/100); // 5 Нижняя полоса g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4])*My_High/100); g.FillRectangle(brush5,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4])*My_High/100); // 6 Нижняя полоса g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4]+Form1.My_Life[5])* My_High/100); g.FillRectangle(brush6,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4]+Form1.My_Life[5])* My_High/100); // 7 Нижняя полоса g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4]+Form1.My_Life[5]+ Form1.My_Life[6])*My_High/100); g.FillRectangle(brush7,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4]+Form1.My_Life[5]+ Form1.My_Life[6])*My_High/100); // 8 Нижняя полоса g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4]+Form1.My_Life[5]+ Form1.My_Life[6]+Form1.My_Life[7])*My_High/100); g.FillRectangle(brush8,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4]+Form1.My_Life[5]+ Form1.My_Life[6]+Form1.My_Life[7])*My_High/100); // 9 Нижняя полоса g.DrawRectangle(pen,5,5,ClientRectangle.Width/2, ClientRectangle.Height - 10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4]+Form1.My_Life[5]+ Form1.My_Life[6]+Form1.My_Life[7]+Form1.My_Life[8])* My_High/100); g.FillRectangle(brush9,5,5,ClientRectangle.Width/2, ClientRectangle.Height -10- (Form1.My_Life[0]+Form1.My_Life[1]+Form1.My_Life[2]+ Form1.My_Life[3]+Form1.My_Life[4]+Form1.My_Life[5]+ Form1.My_Life[6]+Form1.My_Life[7]+Form1.My_Life[8])* My_High/100); // 10 Нижняя полоса }13.1.
Шаг 8. Создаем процедуру очистки текстбоксов в Form1
Для кнопки "Очистить" пишем:
private void button1_Click_1(object sender, System.EventArgs e) { foreach (Control NT in this.Controls) if (NT is TextBox) { NT.Text="0"; } }
Шаг 9. Создаем процедуру вызова диаграммы для просмотра
Для опции главного меню "Диаграмма" пишем:
private void menuItem6_Click(object sender, System.EventArgs e) { int i=0; foreach (Control NT in this.Controls) if (NT is TextBox) {// считываем значения My_Life[i]=int.Parse(NT.Text); // пишем в массив i=i+1; } Form AnForm=new Form2(); AnForm.Show(); }