русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Метод WndProc


Дата добавления: 2015-07-09; просмотров: 1534; Нарушение авторских прав


В классах - наследниках класса 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.

private const int WM_ACTIVATEAPP = 0x001C;

// Флаг активности приложения.

private bool appActive = true;

 

[STAThread]

static void Main()

{



Application.Run(new Form1());

}

 

//===================================================================

public Form1()

{



// Задание свойств формы.

this.Size = new System.Drawing.Size(300,300);

this.Text = “Form1”;

this.Font = new System.Drawing.Font(“Microsoft Sans Serif”,

18F,

System.Drawing.FontStyle.Bold,

System.Drawing.GraphicsUnit.Point,

((System.Byte)(0))

);

}

//===================================================================

 

//===================================================================

// Вот переопределённая оконная процедура.

protected override void WndProc(ref Message m)

{



// Listen for operating system messages.

switch (m.Msg)

{



// Сообщение под кодовым названием WM_ACTIVATEAPP occurs when the application

// becomes the active application or becomes inactive.

case WM_ACTIVATEAPP:

// The WParam value identifies what is occurring.

appActive = (((int)m.WParam != 0));

 

// Invalidate to get new text painted.

this.Invalidate();

break;

}

base.WndProc(ref m);

}

//===================================================================

 

//===================================================================

protected override void OnPaint(PaintEventArgs e)

{



// Стиль отрисовки текста определяется состоянием приложения.

if (appActive)

{



e.Graphics.FillRectangle(SystemBrushes.ActiveCaption,20,20,260,50);

e.Graphics.DrawString(“Application is active”,

this.Font, SystemBrushes.ActiveCaptionText, 20,20);

}

else

{



e.Graphics.FillRectangle(SystemBrushes.InactiveCaption,20,20,260,50);

e.Graphics.DrawString(“Application is Inactive”,

this.Font, SystemBrushes.ActiveCaptionText, 20,20);

}

}

//===================================================================

 

}

}

Контекст приложения

Создаётся простейшее Windows приложение. С единственной формой. Точка входа в приложение – статическая функция Main располагается непосредственно в классе формы. Здесь форма создаётся, инициализируется, показывается.

 

// Этот явно избыточный набор пространств имён формируется

// Visual Studio по умолчанию.

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

 

namespace xForm

{



/// <summary>

/// Summary description for Form1.

/// </summary>

public class Form1 : System.Windows.Forms.Form

{



/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.Container components = null;

 

public Form1()

{



//

// Required for Windows Form Designer support

//

InitializeComponent();

 

//

// 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 и отслеживает присутствие хотя бы одной формы. После закрытия обеих форм приложение завершает выполнение.

 

// По сравнению с предыдущим примером сократили количество

// используемых пространств имён. Оставили только необходимые.

using System;

using System.ComponentModel;

using System.Windows.Forms;

 

namespace xApplicationContext

{



public class xForm : System.Windows.Forms.Form

{//=============================================================================

 

private System.ComponentModel.Container components = null;

private MyApplicationContext appContext;

 

// Модифицировали конструктор.

// 1. Формы украшены названиями.

// 2. В соответствии с замыслом, о факте закрытия формы

// должно быть известно объекту-контексту приложения,

// который осуществляет общее руководство приложением.

public xForm(string keyText, MyApplicationContext contextKey)

{



this.Text = keyText;

appContext = contextKey;

InitializeComponent();

}

 

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.Closed+=new EventHandler(appContext.OnFormClosed);

}

#endregion

/// <summary>

/// The main entry Point for the application.

/// Точка входа в приложение перенесена в класс

/// контекста приложения.

/// </summary>

//[STAThread]

//static void Main()

//{

// Application.Run(new xForm());

//}

}//=============================================================================

 

 

// The class that handles the creation of the application windows

public class MyApplicationContext : ApplicationContext

{//=============================================================================

 

private int formCount;

private xForm form1;

private xForm form2;

 

 

// Конструктор Контекста приложения.

private MyApplicationContext()

{



formCount = 0;

// Create both application forms and handle the Closed event

// to know when both forms are closed.

form1 = new xForm(“Form 0”,this);

formCount++;

 

form2 = new xForm(“Form 1”,this);

formCount++;

 

form1.Show();

form2.Show();

}

 

 

public void OnFormClosed(object sender, EventArgs e)

{



// Форма закрывается - счётчик открытых форм уменьшается.

// Приложение сохраняет работоспособность до тех пор,

// пока значение счётчика не окажется равным 0.

// После этого - Exit().

 

formCount--;

if (formCount == 0)

{



Application.Exit();

}

}

 

[STAThread]

static void Main(string[] args)

{



// Создаётся объект-представитель класса MyApplicationContext,

// который берёт на себя функции кправления приложением.

MyApplicationContext context = new MyApplicationContext();

// Приложение запускается для объекта контекста приложения.

Application.Run(context);

}

}//=============================================================================

 

}

Общие сведения о GDI+

GDI+ (Интерфейс Графических Устройств) — это подистема Microsoft Windows XP, обеспечивающая вывод графической информации на экраны и принтеры. GDI+ является преемником GDI, интерфейса графических устройств, включаемого в ранние версии Windows. Интерфейс GDI+ изолирует приложение от особенностей конкретного графического оборудования. Такая изоляция позволяет разработчикам создавать аппаратно-независимые приложения.

Это набор программных средств, которые используются в в .NET.

GDI+, позволяют создателям приложений выводить данные на экран или на принтер без необходимости обеспечивать работу с определенными типами устройств отображения. Для отображения информации программисту достаточно вызывать нужные методы классов GDI+. При этом автоматически учитываются типы определенных устройств и выполняются вызовы соответствующих драйверов.



<== предыдущая лекция | следующая лекция ==>
Windows message | GraphicsPath


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.275 сек.