Создание оконных приложений в.NET Автор: Хайдуков Дмитрий Сергеевич
Формы Форма - экранный объект, обычно прямоугольной формы, который можно применять для предоставления информации пользователю и для обработки ввода информации от пользователя.
Пространство имен System.Windows.Forms КлассНазначение ApplicationЭтот класс представляет саму суть приложения Windows Forms. При помощи методов этого класса вы можете обрабатывать сообщения Windows, запускать и прекращать работу приложения и т. п. ButtonBase, Button, CheckBox, ComboBox, DataGrid, GroupBox, ListBox, LinkLabel, PictureBox Эти классы (а также многие аналогичные им) представляют элементы графического интерфейса FormЭтот тип представляет главную форму (диалоговое окно) приложения Windows Forms ColorDialog, FileDialog, FontDialog, PrintPreviewDialog В.NET предусмотрено множество готовых к употреблению диалоговых окон для выбора цветов, файлов, шрифтов и т. п. Menu, MainMenu, MenuItem, ContextMenu Эти типы предназначены для создания ниспадающих и контекстных меню Clipboard, Help, Timer, Screen, ToolTip, Cursors Разнообразные вспомогательные типы для организации интерактивных графических интерфейсов StatusBar, Splitter, ToolBar, ScrollBar Дополнительные элементы управления, размещаемые на форме
Создание главного окна using System; using System.Windows.Forms; namespace MyWindowsApp { public class MainWindow : Form { //Выполнение приложения //и идентификация главного окна static void Main(string[] args) { Application.Run(new MainWindow()); } Набрать в командной строке csc /target: winexe *.cs
Разграничение обязанностей using System; using System.Windows.Forms; namespace MyWindowsApp { //Главное окно public class MainWindow : Form { } //Объект приложения public static class Program { static void Main(string[] args) { Application.Run(new MainWindow()); }
Класс System.Windows.Forms.Application Предоставляет статические методы и свойства для управления приложением, в том числе: методы для запуска и остановки приложения; методы для запуска и остановки потоков в рамках приложения; методы для обработки сообщений Windows; свойства для получения сведений о приложении. Метод класса Application Назначение DoEvents()это заменитель многопоточности Exit()Завершает работу приложения Run()Запускает стандартный цикл работы с сообщениями для текущего потока
Иерархия классов в System.Windows.Forms
Анатомия формы Базовые классы из цепочки наследования Form: System.Object System.MarshalByRefObject System.ComponentModel.Component System.Windows.Forms.Control System.Windows.Forms.ScrollableControl System.Windows.Forms.ContainerControl System.Windows.Forms.Form
Цепочка наследования (Обозреватель объектов Visual Studio)
Базовые классы System.Windows.Forms.Form Класс System.Object Как и любой другой класс.NET, класс Form – это объект System.MarshalByRefObject При реализации удаленного взаимодействия тип будет доступен по ссылке (а не по копии) удаленного типа
Базовые классы System.Windows.Forms.Form System.ComponentModel.Component Обеспечивает используемую по умолчанию реализацию интерфейса IComponent В терминах.NET компонентом называется тип, поддерживающий редактирование во время проектирования, но не обязательно видимый во время выполнения
Базовые классы System.Windows.Forms.Form System.Windows.Forms.Control Определяет общие члены пользовательского интерфейса для всех элементов управления Windows Forms, включая саму форму System.Windows.Forms.ScrollableControl Определяет автоматическую поддержку прокрутки содержимого
Базовые классы System.Windows.Forms.Form System.Windows.Forms.ContainerControl Предоставляет функциональную возможность управления фокусом элементам управления, которые могут функционировать как контейнеры для других элементов управления.
Возможности класса Control Класс System.Windows.Forms.Control задает общее поведение, ожидаемое от любого GUI-типа. Базовые члены Control позволяют указать размер и позицию элемента управления, выполнить захват событий клавиатуры и мыши, получить и установить фокус ввода, задать и изменить видимость членов и т.д.
Класс Control. Свойства
Класс Control. События События, учитывающие состояние клавиатуры: KeyPress, KeyUp, KeyDown События, учитывающие состояние мыши: Click, DoubleClick, MouseEnter, MouseDown, MouseUp, MouseMove Событие, позволяющее взаимодействовать с GDI: Paint
Класс Control. Методы
Формы Методы класса Form обеспечивают управление формой: ShowDialog - обеспечивает представление формы как модального диалога; Show - показывает форму как немодальный диалог; SetDesktopLocation - позиционирует форму на поверхности Рабочего стола. Activate – активизирует форму Hide – скрывает форму Close – закрывает форму События: Load – загрузка формы Activated – активизация формы VisibleChanged – видимость формы Deactivated – деактивация формы Closing – закрытие формы Closed – закрытие формы
Элементы управления
Контейнеры Container controls – место для группировки элементов пользовательского интерфейса. Контейнер может управлять доступом к размещаемым на его поверхности элементам управления. К числу контейнеров относятся: Form. Panel - содержащий другие элементы управления. Может быть использован для группировки множества элементов управления. GroupBox - предполагается для размещения радиокнопок и прочих переключателей. Рисует рамочку вокруг элементов управления, которые группируются по какому-либо признаку. TabControl - содержит tab pages, они представлены TabPage-объектами, которые могут добавляться через свойство Controls. Каждая TabPage-страница подобна листку записной книжки: страница с закладкой.
Создание Windows-приложений в Visual Studio
Окно проектирования формы
Окно свойств
Устаревшие элементы управления
Анализ проекта Два файла: Form1.cs Form1.Designer.cs
Анализ проекта Файл Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
Анализ проекта Form1.Designer.cs namespace WindowsFormsApplication2 { partial class Form1 { private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Код, автоматически созданный конструктором форм Windows /// /// Обязательный метод для поддержки конструктора - не изменяйте /// содержимое данного метода при помощи редактора кода. /// private void InitializeComponent() {…} #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.CheckBox checkBox1; private System.Windows.Forms.TextBox textBox1; }
Метод InitializeComponent() private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.checkBox1 = new System.Windows.Forms.CheckBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // button1 this.button1.Location = new System.Drawing.Point(55, 37); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(83, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; // button2 this.button2.Location = new System.Drawing.Point(256, 37); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 1; this.button2.Text = "button2"; this.button2.UseVisualStyleBackColor = true; // checkBox1 this.checkBox1.AutoSize = true; this.checkBox1.Location = new System.Drawing.Point(55, 86); this.checkBox1.Name = "checkBox1"; this.checkBox1.Size = new System.Drawing.Size(80, 17); this.checkBox1.TabIndex = 2; this.checkBox1.Text = "checkBox1"; this.checkBox1.UseVisualStyleBackColor = true; // textBox1 this.textBox1.Location = new System.Drawing.Point(256, 86); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(75, 20); this.textBox1.TabIndex = 3; // Form1 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(423, 322); this.Controls.Add(this.textBox1); this.Controls.Add(this.checkBox1); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); }
Обработка событий в режиме проектирования public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Выполнен щелчок на " + ((Button)sender).Name); } System.EventArgs это базовый класс для классов, содержащих данные о событии object sender – источник события
Обработка событий this.button1.Click += new System.EventHandler(this.button1_Click); private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Выполнен щелчок на " + ((Button)sender).Name); }
Класс Program static class Program { /// /// Главная точка входа для приложения. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
Класс TextBox - однострочное поле public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void textBox1_TextChanged(object sender, EventArgs e) { this.Text = this.textBox1.Text; }
Класс RichTextBox public partial class Form1 : Form { public Form1() { InitializeComponent(); FontFamily family = new FontFamily("Arial"); Font myFont = new Font(family, 25, FontStyle.Bold | FontStyle.Italic); this.richTextBox1.Font = myFont; }
Класс RadioButton - переключатель private void InitializeComponent() { this.groupBox1 = new System.Windows.Forms.GroupBox(); this.radioButton1 = new System.Windows.Forms.RadioButton(); this.radioButton2 = new System.Windows.Forms.RadioButton(); this.radioButton3 = new System.Windows.Forms.RadioButton(); ………………………………………… // groupBox1 this.groupBox1.Controls.Add (this.radioButton3); this.groupBox1.Controls.Add (this.radioButton2); this.groupBox1.Controls.Add (this.radioButton1); ……………………………………… } //Обработчики событий Click private void radioButton1_Click(object sender, EventArgs e) { this.BackColor = Color.Red; } private void radioButton2_Click(object sender, EventArgs e) { this.BackColor = Color.Green; } private void radioButton3_Click(object sender, EventArgs e) { this.BackColor = Color.Yellow; }
Класс ListBox – список Свойства ListBox
Работа с ListBox public partial class Form1 : Form { public Form1() { InitializeComponent(); this.listBox1.Items.Add("Мосвка"); this.listBox1.Items.Add("Новосибирск"); this.listBox1.Items.Add("Красноярск"); } private void listBox1_SelectedValueChanged(object sender, EventArgs e) { this.label1.Text = (string)this.listBox1.SelectedItem; }
Класс CheckBox - флажок public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void checkBox1_CheckedChanged (object sender, EventArgs e) { if (this.checkBox1.Checked) { this.button1.Hide(); } else { this.button1.Show(); } private void InitializeComponent() { this.checkBox1 = new System.Windows.Forms.CheckBox(); this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // checkBox1 // this.checkBox1.AutoSize = true; this.checkBox1.Location = new System.Drawing.Point(12, 28); this.checkBox1.Name = "checkBox1"; this.checkBox1.Size = new System.Drawing.Size(96, 17); this.checkBox1.TabIndex = 0; this.checkBox1.Text = "Срыть кнопку"; this.checkBox1.UseVisualStyleBackColor = true; this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); // // button1 // this.button1.Location = new System.Drawing.Point(147, 24); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(95, 23); this.button1.TabIndex = 1; this.button1.Text = "Кнопка"; this.button1.UseVisualStyleBackColor = true; …………………………. }
Класс TreeView public partial class Form1 : Form { public Form1() { InitializeComponent(); this.treeView1.Nodes.Add("НГТУ"); TreeNode nstu = this.treeView1.Nodes[0]; nstu.Nodes.Add("АВТФ"); nstu.Nodes.Add("ФМА"); nstu.Nodes.Add("ФПМИ"); TreeNode avtf = nstu.Nodes[0]; avtf.Nodes.Add("АМ-809"); avtf.Nodes.Add("АМ-810"); } Служит для отображения иерархических данных в древовидной структуре.
Класс Timer Реализует таймер, который вызывает событие через определенные пользователем интервалы времени. public partial class Form1 : Form { long count = 0; public Form1() { InitializeComponent(); this.timer1.Interval = 1000; this.timer1.Enabled = false; this.label1.Text = count.ToString(); } private void timer1_Tick(object sender, EventArgs e) { count++; this.label1.Text = count.ToString(); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { this.timer1.Enabled = this.checkBox1.Checked; }
Работа со стандартными диалоговыми окнами (ColorDialog) private void InitializeComponent() { this.colorDialog1 = new System.Windows.Forms.ColorDialog(); this.SuspendLayout(); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 262); this.Name = "Form1"; this.Text = "Form1"; this.Click += new System.EventHandler(this.Form1_Click); this.ResumeLayout(false); }
Работа с ColorDialog public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Click(object sender, EventArgs e) { DialogResult res = this.colorDialog1.ShowDialog(); if (res == DialogResult.OK) { Color col = this.colorDialog1.Color; this.BackColor = col; }
Группировка элементов управления. Класс Panel private void InitializeComponent() { this.panel1 = new System.Windows.Forms.Panel(); this.button1 = new System.Windows.Forms.Button(); this.checkBox1 = new System.Windows.Forms.CheckBox(); this.panel1.SuspendLayout(); this.SuspendLayout(); // // panel1 // this.panel1.Controls.Add(this.checkBox1); this.panel1.Controls.Add(this.button1); this.panel1.Location = new System.Drawing.Point(12, 12); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(359, 161); this.panel1.TabIndex = 0; ………………………………………………………………. } Свойство AutoScroll позволяет указать полосы прокрутки
Класс MenuStrip MenuStrip – элемент управления для создания системы меню В MenuStrip могут содержаться: ToolStripMenuItem – традиционный пункт меню ToolStripComboBox – встроенный элемент ComboBox (комбинированное окно) ToolStripSeparator – простая линия, разделяющая содержимое ToolStripTextBox – встроенный элемент TеxtBox (текстовое окно)
Создание меню
Редактор MenuStrip
Создание меню partial class Form1 { private System.Windows.Forms.MenuStrip menuStrip1; private System.Windows.Forms.ToolStripMenuItem FileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem ExitToolStripMenuItem; }
Создание меню private void InitializeComponent() { this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // menuStrip1 this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(284, 24); this.menuStrip1.TabIndex = 0; this.menuStrip1.Text = "menuStrip1"; // fileToolStripMenuItem this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.exitToolStripMenuItem}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); this.fileToolStripMenuItem.Text = "File"; // exitToolStripMenuItem this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.exitToolStripMenuItem.Text = "Exit"; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 262); this.Controls.Add(this.menuStrip1); this.MainMenuStrip = this.menuStrip1; this.Name = "Form1"; this.Text = "Form1"; this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); }
Создание меню private void exitToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); }
MDI приложения IsMdiContainer - true
Создание родительской формы
Обработчики событий для элементов меню private void cascadeToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.Cascade); } private void verticalToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.TileVertical); } private void horiToolStripMenuItem_Click(object sender, EventArgs e) { LayoutMdi(MdiLayout.TileHorizontal); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); }
Отображение списка дочерних окон Свойство MdiWindowListItem определяет пункт меню для автоматического списка имен всех дочерних окон при соответствующем выборе меню
Создание дочерней формы private void ChildForm_Click(object sender, EventArgs e) { int r, g, b; Random ran = new Random(); r = ran.Next(0, 255); g = ran.Next(0, 255); b = ran.Next(0, 255); Color curColor = Color.FromArgb(r, g, b); this.BackColor = curColor; this.Text = curColor.ToString(); }
Создание дочерних окон //Обработчик меню Create private void createToolStripMenuItem_Click(object sender, EventArgs e) { //Создание нового дочернего окна ChildForm newChild = new ChildForm(); //Ссылка на родительскую форму для данного дочернего окна newChild.MdiParent = this; //Отображение новой формы newChild.Show(); }
Пример работы
Пользовательские элементы управления
private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(46, 17); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // label1 // this.label1.AutoSize = true; this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); this.label1.Location = new System.Drawing.Point(42, 69); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(79, 29); this.label1.TabIndex = 1; this.label1.Text = "label1"; }
Пользовательские элементы управления public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Random rnd = new Random(); int val = rnd.Next(100); this.label1.Text = val.ToString(); }
Пользовательские элементы управления