В классах - наследниках класса Control (в классах Form, Кнопка, Список, …) объявляется виртуальный метод WndProc, который обеспечивает обработку передаваемых приложению сообщений Windows. Переопределение этого метода позволяет задавать специфику поведения создаваемого элемента управления, включая и саму форму.
protected virtual void WndProc(ref Message m);
Parameters
m
The Windows Message to process.
Все сообщения после PreProcessMessage метода поступают к WndProc методу. В сущности, ничего не изменилось! WndProc method в точности соответствует WindowProc функции.
Пример переопределения WndProc
Реакция приложения на передаваемые в оконную процедуру WndProc сообщения Windows определяет поведение приложения. Метод WndProc в приложении может быть переопределён. При его переопределении следует иметь в виду, что для адекватного поведения приложения в среде Windows необходимо обеспечить вызов базовой версии метода WndProc. Всё, что не было обработано в рамках переопределённого метода WndProc, должно обрабатываться в методе базового класса.
Ниже демонстрируется пример переопределения метода WndProc. В результате переопределения приложение “научилось” идентифицировать и реагировать на системное сообщение WM_ACTIVATEAPP, которое передаётся каждому приложению при переводе приложения из активного состояния в пассивное и обратно.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace csTempWindowsApplication1
{
public class Form1 : System.Windows.Forms.Form
{
// Здесь определяется константа, которая содержится в «windows.h» header file.
Создаётся простейшее Windows приложение. С единственной формой. Точка входа в приложение – статическая функция Main располагается непосредственно в классе формы. Здесь форма создаётся, инициализируется, показывается.
// Этот явно избыточный набор пространств имён формируется
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = “Form1”;
}
#endregion
/// <summary>
/// The main entry Point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
Приложение, в задачи которого входит поддержка нескольких одновременно существующих (и, возможно, взаимодействующих) форм, создаётся с использованием дополнительного класса – класса контекста приложения. В этом классе обычно и объявляется Функция Main.
ApplicationContext (контекст приложения) специфицирует и объединяет контекстную информацию о потоках приложения.
Это класс, который позволяет собрать в единый модуль основные элементы приложения. Перечень членов класса представлен ниже. Их количество невелико, но вполне достаточно для централизованного формирования и запуска всех элементов приложения.
Пара конструкторов, которые обеспечивают инициализацию объекта. Один из них в качестве параметра использует ссылку на объект-представитель класса формы.
Свойство MainForm, определяющее главную форму данного контекста приложения.
Общедоступные методы Dispose (Overloaded. Releases the resources used by the ApplicationContext), Equals (inherited from Object), ExitThread (Terminates the message loop of the thread), GetHashCode (inherited from Object), GetType (inherited from Object), ToString (inherited from Object).
Событие ThreadExit, которое происходит когда в результате выполнение метода ExitThread прекращает выполнение цикл обработки сообщений.
Protected методы Dispose (Releases the resources used by the ApplicationContext), ExitThreadCore (Terminates the message loop of the thread), Finalize, MemberwiseClone, OnMainFormClosed.
Можно обойтись без контекста приложения, однако программный код, создаваемый с использованием объекта-представителя класса контекста приложения позволяет инкапсулировать детали реализации конкретных форм приложения. Прилагаемый фрагмент приложения обеспечивает создание пары форм-представителей класса MyForm и отслеживает присутствие хотя бы одной формы. После закрытия обеих форм приложение завершает выполнение.
// По сравнению с предыдущим примером сократили количество
// используемых пространств имён. Оставили только необходимые.
GDI+ (Интерфейс Графических Устройств) — это подистема Microsoft Windows XP, обеспечивающая вывод графической информации на экраны и принтеры. GDI+ является преемником GDI, интерфейса графических устройств, включаемого в ранние версии Windows. Интерфейс GDI+ изолирует приложение от особенностей конкретного графического оборудования. Такая изоляция позволяет разработчикам создавать аппаратно-независимые приложения.
Это набор программных средств, которые используются в в .NET.
GDI+, позволяют создателям приложений выводить данные на экран или на принтер без необходимости обеспечивать работу с определенными типами устройств отображения. Для отображения информации программисту достаточно вызывать нужные методы классов GDI+. При этом автоматически учитываются типы определенных устройств и выполняются вызовы соответствующих драйверов.