- •Int cbClsExtra;
- •Int cbWndExtra;
- •Создание и отображение окна
- •Int nWidth,
- •Int nHeight,
- •Оконная процедура
- •Int winapi MessageBox(
- •6) Дочернее окно может по своему дескриптору Chld получить дескриптор родительского окна при помощи функции:
- •8) При уничтожении родительского окна сообщение wm_destroy также рассылается всем дочерним окнам.
- •Параметры:
- •10) При уничтожении дочернего окна функцией DestroyWindow() родительскому окну тоже передается сообщение wm_destroy.
- •4) После того, как дочернее окно было создано, оно может посылать сообщение wm_command, уведомляющие pодительское окно об изменении своего состояния.
- •7) В программе функция InitStr() объявлена следующим образом:
- •Void InitStr(hwnd hWnd, char *s, int Max, char Sy);
- •Void InitStr(hwnd hWnd,char *s,int Max,char Sy)
- •11) Код функции обработки пароля приведён в листинге:
- •If(IsIconic(hwnd)) ShowWindow(hwnd,sw_restore);
- •If (!RegClass(WndProc,szMainClass,color_desktop))
Лекция №3. Регистрация класса окна. Создание окна.
При инициализации окна необходимо описать параметры окна и зарегистрировать его в Windows.
Параметры окна задаются с помощью структуры данных WNDCLASS. Вот ее определение:
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 — Задает стиль окна. Если использовать стиль как wc.style = CS_HREDRAW | CS_VREDRAW, то это означает, что окно будет перерисовываться при изменении его размеров по горизонтали или по вертикали. Полный список стилей с их описанием приведен в библиотеке MSDN.
lpfnWndProc — Указатель на оконную процедуру. Окна, созданные на основе одного и того же экземпляра структуры WNDCLASS будут совместно использовать одну и ту же оконную процедуру. Например можно использовать как wc.lpfnWndProc = WndProc;
cbClsExtra и cbWndExtra — Это дополнительные области памяти, которые можно использовать в своих собственных целях. Если дополнительные области памяти не нужны, то обоим параметрам присваивается 0: wc.cbClsExtra = 0; wc.cbWndExtra = 0;
hInstance — поле для дескриптора экземпляра приложения, например так: wc.hInstance = instanceHandle;
hIcon — Дескриптор значка, используемого для окон, создаваемых на основе данного класса. Существует несколько стандартных значков операционной системы и можно выбрать один из них. Например: wc.hIcon = LoadIcon(0, IDI_APPLICATION);
hCursor — Дескриптор курсора приложения, определяющий как будет выглядеть указатель мыши, когда он находится в клиентской области окна. Здесь также есть несколько встроенных типов курсоров. Например так: wc.hCursor = LoadCursor(0, IDC_ARROW);
hbrBackground — Цвет фона клиентской области окна.
lpszMenuName — Задает меню окна. Если нет меню, то значение этого поля равно 0.
lpszClassName — Определяет имя создаваемого класса окна. Можно выбрать любое имя. Имя используется для идентификации структуры данных класса, чтобы можно было обращаться к ней в дальнейшем. Например на С, это будет выглядеть так: wc.lpszClassName = "Hello";
После описания параметров класса окна, необходимо зарегистрировать окно в Windows с помощью функции RegisterClass, которая получает указатель на структуру WNDCLASS. В случае успешного завершения функция возвращает 0. Например на С, это будет выглядеть так: if(!RegisterClass(&wc))
На ассемблере регистрация класса окна будет выглядеть так:
REG_CLASS:
; заполняем структуру окна
MOV [WC.CLSSTYLE],style
; процедура обработки сообщений
MOV [WC.CLWNDPROC], OFFSET WNDPROC
MOV [WC.CLSCEXTRA], 0
MOV [WC.CLWNDEXTRA], 0
MOV EAX, [HINST]
MOV [WC.CLSHINSTANCE], EAX
; ---------- иконка окна
PUSH IDI_APPLICATION
PUSH 0
CALL LoadIconA
MOV [WC.CLSHICON], EAX
;----------- курсор окна
PUSH IDC_CROSS
PUSH 0
CALL LoadCursorA
MOV [WC.CLSHCURSOR], EAX
; ----------
MOV [WC.CLBKGROUND],17 ; цвет окна
MOV DWORD PTR [WC.CLMENUNAME], 0
MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
PUSH OFFSET WC
CALL RegisterClassA