Окна в Windows. Функции окна. Класс окна

Windows не является объектно-ориентированной ОС. Но она придерживается объектно-

ориентированного подхода. Фраза стала нелогичной с 1993. Появился FrameWork – объектно-ориентированная надстройка.

Окна в Windows определяются как структуры, содержащие поля данных. Совокупности методов,

управляющих полями, реализованы в виде одной функции, которая называется функцией окна.

Функция окна – функция языка Си, которая определяется для одного окна, либо для целой группы окон. При возникновении событий, имеющих отношения к окну, функция формирует сообщения, описывающие события и направляет его в нужную функцию окна. Функция окна анализирует сообщения и выполняет соответствующие действия. Поэтому основной задачей функции окна является обработка сообщений, распределяемых окну ОС.

Т.о. единственная для каждого окна функция окна регулирует все методы окна как объекта.

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

Приложения могут создавать собственные классы окна, либо использовать стандартные, определенные Windows классы окна. Любое создаваемое окно может наследовать свойство уже созданных ранее окон. Для большинства стандартных элементов управления, таких как кнопки, меню, списки и т.ж. уже определены классы окна и все необходимые методы.

1) Описание функции окна: функция окна не стандартна, ее нельзя напрямую вызвать из функции WinMain или любой другой. Вызов функции окна осуществляет ОС.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)

{

switch (msg)

{

}

return DefWindowProc (hWnd, msg, wp, lp);

}

Тип возвращаемого значения указывает, что функция окна это функция обратного вызова. Имя

функции окна может быть произвольным.

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

3 следующих параметра описывают передаваемые сообщения. Параметр msg передает код сообщения. Следующий параметр описывает дополнительную информацию передаваемого функцией окна вместе с сообщением. Формат этой информации зависит от кода сообщения для обработки сообщений, которые не обрабатываются функцией окна, называется функцией программного интерфейса Windows с именем DefWindowsProc.

2) Описание класса окна.

#include <windows.h>

WNDCLASS typedef struct tagWNDCLASS

{

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;


} WNDCLASS;

1 – определяет стиль класса, задается в виде именованных констант с префиксами.

CS_VREDRAW – окно должно быть перерисовано с изменением масштаба, горизонтального размера.

Стиль задает реакцию окна на некоторые события и характеристики отображения окна.

2 – содержит адрес функции окна, которая будет выполнять обработку сообщений, поступающих во все окна, созданные на базе данного класса.

3 – используется для выделения дополнительной памяти, общей и доступной для всех окон, созданных на базе данного класса.

4 – позволяет увеличить размер области памяти для хранения информации (общей и доступной), имеющей отношение к экземпляру окна.

5 – содержит идентификатор приложения, создающий класс окна.

6 – содержит идентификатор пиктограммы, в которую превращается окно при инициализации. Пиктограмма может быть загружена с помощью LoadIcon(HINSTANCE, LPCSTR) – 1 параметр идентификатор приложения, 2 – идентификатор ресурса.

7 – задает вид курсора мыши, при его прохождении над окном, LoadCursor(..).

8 – определяет кисть для закрашивания поля окна, в качестве кисти используется либо цвет, либо пиктограмма.

9 – определяет меню главного окна приложения. Если меню нет, то используется NULL.

3) Регистрация класса окна. Для создания окна на основе разработанного класса его необходимо предварительно зарегистрировать с помощью:

ATOM WINAPI RegisterClass(const WNDCLASS *wndclass);

В качестве аргумента используется адрес, полностью инициализирующий структуру класса окна.

ATOM WndClass;

WNDCLASS wc;

WndClass = RegisterClass(& wc);

ATOM – тип идентификатора текстовых строк, которые храняться в системной памяти.

4) Создание главного окна приложения.

HWND WINAPI CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, // int y, // лев верх угол int nWidth, // ширина int nHeight, //высота HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);

Отображение окна на экране:

ShowWindow(HWND hwnd, in CmdShow);

UpdateWindows(HWND); // внутренняя

Обработка сообщений. Приложение с обработкой сообщений.

Основная работа, которую выполняет приложение, заключается в обслуживании собственных окон. Приложение в цикле опрашивает в свою очередь сообщения. Обнаружив сообщения, приложение распределяет их в нужную часть окна, который выполняет их обработку.

Сообщение представляет собой следующую структуру:

typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt;} MSG;

Распределение сообщений между различными приложениями основано на понятии word-атрибут, который в любой момент может относиться к одному окну.

Сообщения от клавиатуры распределяются сначала в очередь расположения сообщений, создавшее окно, а затем в функцию окна, владеющую клавишей ввода. Изменение фокуса ввода происходит при помощи комбинации клавиш клавиатуры, либо мышью.

Сообщения от драйвера мыши всегда передаются в функцию окна, над которой находится курсор мыши.

Цикл обработки сообщений. После отображения окна функция WinMain запускает цикл обработки сообщений.

while (GetMessage(&msg, 0, 0, 0))

{

DispatchMessage(&msg);

}

Функция GetMessage выбирает сообщения из функции приложения.

1 параметр – указатель на структуру типа MSG. В нее записывается выбранное из очереди сообщение.

2 параметр – идентификатор окна, для которого необходимо выбрать сообщения. Для значения 0 будут выбираться сообщения для всех окон приложения.

3 и 4 параметры – определяют диапазон сообщений. При 0 выбираются все сообщения. Если из очереди выбираются сообщения с кодом WM_QUIT, функция возвращает сообщение со значением FALSE, что приводит к окончанию цикла выборки сообщений.

Функция DispatchMessage используется для распределения сообщений в функцию окна, для которой она выполняется.

Приложение определяет один класс окна и на его основе создает главное окно приложения. Функция окна обрабатывает сообщения от главной клавиши мыши. В ответ на сообщения функция окна выводит диалоговую панель.

#include <windows.h>

#include <mem.h> // для работы с динамической памятью

BOOL InitApp(HINSTANCE);

LRESULT CALLBACK WndProc(HWND, HINT, WPARAM, LPARAM);

Нужны 2 глобальных массива:

charsz ClassName[] = “WindowsAppClass”;

charsz WindowTitle[] = “WindowApp”;

int WINAPI WinMain

(HINSTANCE hInstance;

HINSTANCE hPrevInstance;

LPSTR lpszCmdLine;

Int CmdShow);

{

MSG msg;

HWND hwnd;

}

И т.д. из проги.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: