Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

17. Структура GUI-приложения. Регистрация класса окон.




17. Структура GUI-приложения. Регистрация класса окон.

Так как в GUI-приложении должно быть минимум одно окно, в структуре приложения можно выделить следующие блоки:

1) регистрация класса окон

2) создание главного окна

3) процедура главного окна

4) цикл обработки сообщений

Регистрация класса окон

Прежде чем создавать окно, должен быть зарегистрирован класс окон. Окно затем создается как экземпляр данного класса.

Для регистрации используется API-функция RegisterClass, с одним параметром – адресом структуры, имеющей тип WNDCLASS:

ATOM RegisterClass(           

           CONST WNDCLASS *lpWndClass

);

typedef struct _WNDCLASS {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HANDLE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

} WNDCLASS;

Style – стиль окна: перерисовывать окно при перемещении, деактивировать кнопку «Закрыть», эффекты Windows XP и др.

lpfnWndProc – адрес процедуры обработки сообщений окна. Для всех окон данного класса объявляется одна процедура окна. Каждое окно при создании имеет собственный дескриптор. Часто для каждого окна создают свой класс.

cbClsExtra – количество дополнительных байт для класса. Должен быть равен нулю.

cbWndExtra – количество дополнительных байт для окна. Должен быть равен нулю.

hInstance – дескриптор приложения, которое содержит процедуру для данного класса.

hIcon – дескриптор пиктограммы окна. Если ноль, то по умолчанию.

hCursor – дескриптор курсора мыши. Если ноль, то по умолчанию.

hbrBackground – цвет окна.

lpszMenuName – имя ресурса, содержащего меню.

lpszClassName – адрес строки, содержащей имя класса.

 

18. GUI-приложения: создание главного окна, процедура окна.

Для создания окна используется функция CreateWindow:

HWND CreateWindow(

           LPCTSTR lpClassName,

           LPCTSTR lpWindowName,

           DWORD dwStyle,

           int x,

           int y,

           int nWidth,

           int nHeight,

           HWND hWndParent,

           HMENU hMenu,

           HINSTANCE hInstance, (=0)

           LPVOID lpParam

);

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

lpWindowName – адрес строки, где содержится имя создаваемого окна (отображается в заголовке).

dwStyle – стиль окна:

· WS_MAXIMIZE – развернутое окно

· WS_MINIMIZE – свернутое окно

· WS_CAPTION – есть заголовок

· WS_DISABLED – недоступное окно

· WS_SIZEBOX – окно с изменяемыми размерами

· WS_VISIBLE – видимое окно

x, y – координаты левого верхнего угла.

nWidth, nHeight – ширина и высота окна.

hWndParent – дескриптор родительского окна. Для главного окна = 0.

hMenu – дескриптор меню. Обычно равен нулю.

hInstance – дескриптор модуля, который ассоциирован с этим окном. В Windows NT/2000/XP игнорируется.

lpParam – адрес переменной, которая будет передана в окно.

Каждое окно имеет процедуру окна (window procedure) – функцию, которая обрабатывает все сообщения, передаваемые всем окнам данного класса. Процедура окна начинает работать сразу после создания окна.

Процедура окна должна иметь 4 параметра:

LRESULT CALLBACK WindowProc(     HWND hwnd,

           UINT uMsg,

           WPARAM wParam,

           LPARAM lParam

);

Hwnd – дескриптор окна (процедура одна на целый класс окон).

uMsg – число – идентификатор сообщения.

wParam, lParam – дополнительные параметры.

Если процедура окна не обрабатывает какие-то сообщения, их должна обрабатывать системная процедура DefWindowProc с теми же параметрами. Процедура окна возвращает ноль, если сообщение обработано и значение, возвращаемое DefWindowProc, в противном случае.

 

19. GUI-приложения: цикл обработки сообщений.

В цикле обработки сообщений (message loop) приложение должно брать сообщение из очереди сообщений и направлять его в соответствующую процедуру окна.

Для выборки сообщений из очереди используются функции GetMessage и PeekMessage.

Функция GetMessage ожидает появления хотя бы одного сообщения, выбирает первое из очереди и возвращает управление.

Функция PeekMessage возвращает управление, даже если очередь пуста.

BOOL GetMessage(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax

);

lpMsg – адрес сообщения (структура MSG ).

hWnd – дескриптор окна, сообщения которого должны быть получены

если ноль, то получаются все сообщения данного приложения.

wMsgFilterMin, wMsgFilterMax нижняя и верхняя граница получаемых сообщений. Если ноль, то получаются все сообщения. Можно использовать константы WM_KEYFIRST / WM_KEYLAST и WM_MOUSEFIRST / WM_MOUSELAST для получения сообщений только клавиатуры и мыши.

Возвращаемое функцией значение: при получении сообщения функция возвращает положительное число;

если сообщение WM_QUIT, то функция возвращает 0;

в случае ошибки функция возвращает–1.

Для передачи сообщения соответствующей процедуре окна используется функция DispatchMessage:

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...