Professional Documents
Culture Documents
5 лекція. winforms
5 лекція. winforms
План
1. Вступ у Windows Forms
2. Робота з формами
3. Контейнери у Windows Forms
4. Елементи керування
5. Меню і панелі інструментів
Створення графічного додатку
Name: встановлює ім'я форми - точніше ім'я класу, який успадковується від класу Form
BackColor: вказує на фоновий колір форми. Клацнувши на це властивість, ми зможемо вибрати той колір, який
на формі.
ControlBox: вказує, відображається меню форми. В даному випадку під меню розуміється меню верхнього рівня,
де знаходяться іконка програми, заголовок форми, а також кнопки мінімізації форми і хрестик. Якщо ця
властивість має значення false, то ми не побачимо ні іконку, ні хрестика, з допомогою якого зазвичай
закривається форма
Основні властивості форм
Cursor: визначає тип курсору, який використовується на формі
Enabled: якщо ця властивість має значення false, то вона не зможе отримувати введення від користувача, тобто ми
Font: визначає шрифт для всієї форми та всіх розміщених на неї елементів управління. Однак, задавши у елементів
FormBorderStyle: вказує, як буде відображатися межа форми і рядок заголовка. Встановлюючи цю властивість в
Location: визначає положення по відношенню до верхнього лівого кута екрана, якщо для властивості StartPosition
MaximumSize: задає максимальний розмір форми, MinimumSize: задає мінімальний розмір форми, Opacity:
StartPosition: вказує на початкову позицію, з якою форма з'являється на екрані, Text: визначає заголовок
форми, TopMost: якщо ця властивість має значення true, то форма завжди буде знаходитися поверх інших
вікон
Visible: видима форма, якщо ми хочемо приховати форму від користувача, то можемо задати даної властивості
значення false
WindowState: вказує, в якому стані форма буде знаходитися при запуску: в нормальному, максимизированном
або мінімізованому
Основні властивості форм
За допомогою значень властивостей у вікні Властивості ми можемо змінити на свій
розсуд зовнішній вигляд форми, але все те ж саме ми можемо зробити динамічно в коді.
public Form1()
{
InitializeComponent();
Text = "Hello World!";
this.BackColor = Color.Aquamarine;
this.Width = 250;
this.Height = 250;
}
Додавання форм. Взаємодія між формами
Щоб додати ще одну форму в проект, натиснемо на ім'я проекту у вікні Solution Explorer (Оглядач
рішень) правою кнопкою миші і виберемо Add(Додати)->Windows Form...
Отже, у нас в проект додано друга форма. Тепер спробуємо здійснити взаємодія між двома формами.
Припустимо, перша форма по натисненню на кнопку буде викликати другу форму. По-перше, додамо на
першу форму Form1 кнопку і подвійним клацанням по кнопці перейдемо в файл коду. Отже, ми
потрапимо в обробник події натискання кнопки, який створюється за замовчуванням після подвійного
клацання по кнопці:
private void button1_Click(object sender, EventArgs e) {
Form2 newForm = new Form2();
newForm.Show();
}
Додавання форм. Взаємодія між формами
Тепер зробимо навпаки - щоб друга форма впливала на першу. Для цього
скористаємося передачею посилання на форму в режимі конструктора. Отже
перейдемо до другої формі і перейдемо до її коду. Отже, змінимо файл коду другої
форми на наступний:
public partial class Form2 : Form {
public Form2() {
InitializeComponent(); }
public Form2(Form1 f) {
InitializeComponent(); f.BackColor = Color.Yellow;
} }
Додавання форм. Взаємодія між формами
Фактично ми тільки додали тут новий конструктор public Form2(Form1 f), в якому ми отримуємо першу
форму і встановлюємо її фон в жовтий колір. Тепер перейдемо до коду першої форми, де ми
викликали другу форму і змінимо його на наступний:
private void button1_Click(object sender, EventArgs e) {
Form2 newForm = new Form2(this);
newForm.Show();
}
Оскільки в даному випадку ключове слово this являє посилання на поточний об'єкт - об'єкт Form1, то
при створенні другої форми вона буде отримувати її (посилання) і через неї керувати першою формою.
Тепер після натискання на кнопку у нас буде створена друга форма, яка відразу змінить колір першої
форми.
Додавання форм. Взаємодія між формами
після цього Visual Studio автоматично згенерує обробник події. Наприклад, натиснемо для
створений подібним чином обробник, то нам треба не тільки видалити метод з коду форми
При створенні непрямоугольных форм, як правило, не використовуються межі форми, так як межі задаються
цим об'єктом Region. Щоб прибрати межі форми, треба привласнити у форми властивості FormBorderStyle
значення None.
І ще один аспект, який треба враховувати, полягає в переміщенні, закриття, максимізації та мінімізації форм.
Тобто в даному випадку , як у звичайній формі, ми не зможемо натиснути на хрестик, щоб закрити форму, не
зможемо її перемістити на нове місце. Тому нам треба додатково визначати для цього програмну логіку.
візуальний стиль.
Всі контейнери мають властивість Controls, яке містить всі елементи даного контейнера. Коли ми
автоматично додається в дану колекцію даного контейнера. Або ми також можемо додати
динамічно. Для цього додамо подія завантаження форми, в якому буде створюватися новий
елемент управління. Це можна зробити або за допомогою коду, або візуальним образом.
Динамічне додавання елементів
private void Form1_Load(object sender, EventArgs e) {
helloButton.BackColor = Color.LightGray;
helloButton.ForeColor = Color.DarkGray;
helloButton.Text = "Привет";
this.Controls.Add(helloButton); }
додаємо її в колекцію елементів форми. Якщо б ми це не зробили, ми б кнопку не побачили, оскільки в цьому
випадку для нашої форми її просто не існувало б. За допомогою методу Controls.Remove() можна видалити раніше
this.Controls.Remove(helloButton);
Элементы GroupBox, Panel и FlowLayoutPanel
Label
Для відображення простого тексту на формі, доступного тільки для читання,
служить елемент Label. Щоб задати текст мітки, треба встановити властивість
Text елемента.
LinkLabel
Особливий тип міток представляють елементи LinkLabel, які призначені для
виводу посилань, які аналогічні посиланнях, розміщених на стандартних веб-
сторінок.
Мітки і ссилки
linkLabel1_LinkClicked
яке є у елемента LinkLabel. (object sender,
LinkLabelLinkClickedEventArgs e)
Наприклад, нехай у нас на формі є
{
елемент посилання називається System.Diagnostics.Process.Start
("http://metanit.com");
linkLabel1 і який містить деяку }
посилання:
Текстове поле TextBox
Для введення і редагування тексту призначені текстові поля - елемент TextBox.
Так само як і у елемента Label текст елемент TextBox можна встановити або
отримати з допомогою властивості Text.
За замовчуванням при перенесенні елементу з панелі інструментів створюється
однорядковий текст. Для відображення великих обсягів інформації в
текстовому полі потрібно використовувати його властивості Multiline і ScrollBars.
При установці властивості Multiline значення true, всі надлишкові символи, які
виходять за межі поля, будуть переноситися на новий рядок.
Текстове поле TextBox
Щоб задати маску, треба встановити властивість Mask елемента. Знайшовши це властивість у вікні
властивостей (Porperties), натиснемо на нього і нам відкриється вікно для завдання одного із
стандартних шаблонів маски. Зокрема ми можемо вибрати Phone number (номер), який
Тепер зробимо свою маску. Наприклад, створимо маску для введення ініціалів імені і по батькові та прізвищ
обмеженої довжини у текстове поле. Для цього присвоїмо властивості Mask значення L. L. L?????????. Тоді
введення в текстове поле буде виглядати наступним чином:
Властивість BeepOnError при встановленні значення true подає звуковий сигнал при введенні некоректного
символу.
Властивість HidePromptOnLeave при установці в true при втрати текстовим полем фокуса приховує, зазначені в
PromptChar
Властивість PromptChar вказує на символ, який відображається в полі на місці введення символів. За
замовчуванням стоїть знак підкреслення
Елементи Radiobutton та CheckBox
Елемент або прапорець CheckBox призначений для
установки одного з двох значень: відзначений або не
відзначено. Щоб відзначити прапорець, треба
встановити біля його властивості Checked значення true.
Крім властивості Checked у елемента CheckBox є
властивість CheckState, яке дозволяє задати для
прапорця одне з трьох станів - Checked (відзначений),
Indeterminate (прапорець не визначено - відмічений,
але знаходиться в неактивному стані) і Безконтрольно
(не зазначений)
Елементи Radiobutton та CheckBox
Також слід відзначити властивість AutoCheck - якщо воно має значення false, то ми не можемо змінювати стан
При зміні стану прапорця він генерує подію CheckedChanged. Обробляючи цю подію, ми можемо отримувати
if (checkBox.Checked == true) {
} else {
} }
Елементи Radiobutton та CheckBox
При цьому треба враховувати, що якщо ми встановлюємо значення властивості Value у вікні
властивостей, то там в якості роздільника цілої та дробової частини використовується кома.
Якщо ж ми встановлюємо властивість в коді, тоді як роздільник використовується крапка.
За замовчуванням при натисканні на стрілочки вгору-вниз на елементі значення буде
збільшуватися, або зменшуватися на одиницю. Але з допомогою властивості Increment
можна задати інший крок прирощення, в тому числі і дробовий.
При роботі з NumericUpDown слід враховувати, що його властивість Value (як і властивості
Minimum і Maximum) зберігає значення decimal. Тому в коді ми також повинні з ним
працювати як з decimal, а не як до типу int або double.
Елементи NumericUpDown и DomainUpDown
Елемент DomainUpDown призначений для введення текстової інформації. Список для
алфавітом (властивість Sorted = true). Цикл - властивість Wrap значення true. У коді вибране
InitializeComponent(); koef = 1; }
timer1.Tick += timer1_Tick; } } }
}
// обробник події Tick таймера
Елементи TrackBar, Timer і ProgressBar
Через кожний інтервал таймера буде спрацьовувати обробник timer1_Tick, в якому змінюється
додаткової змінної koef можна керувати напрямом руху. Крім того, за допомогою обробника
натискання кнопки button1_Click можна зупинити таймер (і разом з ним рух кнопки), або знову
запустити його.
Елементи TrackBar, Timer і ProgressBar
public partial class Form1 : Form { }
public Form1() { // обробник події Tick таймера
InitializeComponent(); void timer1_Tick(object sender, EventArgs e) {
timer1.Interval = 500; // 500 мілісекунд progressBar1.PerformStep();
timer1.Enabled = true; } }
timer1.Tick += timer1_Tick;
Елементи DateTimePicker і
MonthCalendar
DateTimePicker являє
розкривається по
натисненню календар, в
якому можна вибрати дату.
елемент, який з допомогою
переміщення повзунка
дозволяє вводити числові
значення.
Елементи DateTimePicker і
MonthCalendar
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
dateTimePicker1.Format = DateTimePickerFormat.Time;
dateTimePicker1.ValueChanged+=dateTimePicker1_ValueChanged;
}
private void dateTimePicker1_ValueChanged(object sender, EventArgs e) {
label1.Text = String.Format("Ви вибрали: {0}", dateTimePicker1.Value.ToLongTimeString());
}
}
Елементи DateTimePicker і MonthCalendar
monthCalendar1.TodayDate= new DateTime(2015, 05, 22);
monthCalendar1.ShowTodayCircle = true;
monthCalendar1.ShowToday = false;
monthCalendar1.SelectionStart = new DateTime(2015, 05, 1);
monthCalendar1.SelectionEnd = new DateTime(2015, 05, 11);
Елемент PictureBox
Елемент WebBrowser
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
webBrowser1.Url=new
Uri("http://google.com");
button1.Click+=button1_Click;
}
Елемент ErrorProvider
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace HelloApp {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
nameBox.Validating += nameBox_Validating;
ageBox.Validating += ageBox_Validating;
}
private void nameBox_Validating(object sender, (object sender, CancelEventArgs e) {
CancelEventArgs e) { int age = 0;
if (String.IsNullOrEmpty(nameBox.Text)) { if (String.IsNullOrEmpty(ageBox.Text)) {
errorProvider1.SetError(nameBox, "Не errorProvider1.SetError(ageBox, "Не вказано вік!");
вказано ім'я!"); }
} else if (!Int32.TryParse(ageBox.Text, out age)) {
else if (nameBox.Text.Length < 4) { errorProvider1.SetError(ageBox, " Неправельний
errorProvider1.SetError(nameBox, вік!");
"Занадто коротке ім'я!"); } else {
} else { errorProvider1.Clear();
errorProvider1.Clear(); } } } }
} }
private void ageBox_Validating
Панель інструментів ToolStrip
Елемент MenuStrip
Меню MenuStrip
public partial class Form1 : Form { aboutItem.Click += aboutItem_Click;
public Form1() { menuStrip1.Items.Add(aboutItem);
InitializeComponent(); }
ToolStripMenuItem fileItem = new void aboutItem_Click (object sender, EventArgs
ToolStripMenuItem("Файл"); e) {
fileItem.DropDownItems.Add("Створити"); MessageBox.Show("Про програму");
fileItem.DropDownItems.Add(new }
ToolStripMenuItem("Зберегти")); }
menuStrip1.Items.Add(fileItem);
ToolStripMenuItem aboutItem = new
ToolStripMenuItem("Про програму");
Меню MenuStrip
Меню MenuStrip
public partial class Form1 : Form { saveItem.CheckedChanged +=
public Form1() { menuItem_CheckedChanged;
InitializeComponent(); ToolStripMenuItem fileItem.DropDownItems.Add(saveItem);
fileItem = new ToolStripMenuItem("Файл"); menuStrip1.Items.Add(fileItem);
ToolStripMenuItem newItem = new }
ToolStripMenuItem("Створити") { Checked = true,
CheckOnClick = true };
fileItem.DropDownItems.Add(newItem);
ToolStripMenuItem saveItem = new
ToolStripMenuItem("Зберегти") { Checked = true,
CheckOnClick = true };
Меню MenuStrip
if (menuItem.CheckState == CheckState.Checked)
MessageBox.Show("Відзначений");
MessageBox.Show("Відмітка знята");
}
Меню MenuStrip
fileToolStripMenuItem.Image =
Image.FromFile(@"D:\Icons\0023\block32.png");
Елемент StatusStrip
Елемент StatusStrip
public partial class Form1 : Form { statusStrip1.Items.Add(infoLabel);
ToolStripLabel dateLabel; statusStrip1.Items.Add(dateLabel);
ToolStripLabel timeLabel; statusStrip1.Items.Add(timeLabel);
ToolStripLabel infoLabel; timer = new Timer() { Interval = 1000 };
Timer timer; timer.Tick += timer_Tick;
public Form1() { timer.Start();
InitializeComponent(); }
infoLabel = new ToolStripLabel(); void timer_Tick(object sender, EventArgs e) {
infoLabel.Text = "Текущие дата и время:"; dateLabel.Text = DateTime.Now.ToLongDateString();
dateLabel = new ToolStripLabel(); timeLabel.Text =
timeLabel = new ToolStripLabel(); DateTime.Now.ToLongTimeString();
}}
Елемент StatusStrip
Меню ContextMenuStrip
ContextMenuStrip являє контекстне меню. Даний компонент у чому
аналогічний елементи MenuStrip за тим винятком, що контекстне меню не
може використовуватися саме по собі, воно обов'язково застосовується до
якого-небудь елементу, наприклад, текстового поля.