Функция WinMain
LRESULT CALLBACK WindowProc(HWND hwnd,// handle to window UINT uMsg,// message identifier WPARAM wParam,// first message parameter LPARAM lParam // second message parameter );Параметр hwnd содержит дескриптор окна, uMsg – тип сообщения, остальные два – содержат дополнительную информация, прилагающуюся к сообщению.
Функция окна продолжает получать сообщения от системы, пока окно не будет разрушено. Даже в процессе разрушения функция получает дополнительные сообщения, позволяющие завершить необходимые задачи. Функция определяет действительное поведение данного окна, какой ответ оно даст системе на посланные команды.
Функция окна может выбрать отвечать или нет на данное сообщения. В случае игнорирования надо всё-таки дать возможность системе получить ответ с помощью
LRESULT DefWindowProc(HWND hWnd,// handle to window UINT Msg,// message identifier WPARAM wParam,// first message parameter LPARAM lParam // second message parameter );Эта функция выполняет действия по умолчанию, основываясь на сообщении и его параметрах.
Оконный класс
typedef struct _WNDCLASSEX { UINT cbSize; //размер структуры WNDCLASSEX в байтах UINT style; //стиль окна (примеры стилей см.таблицу №1 Приложения 1) WNDPROC lpfnWndProc; //указатель на оконную функцию int cbClsExtra; /*число дополнительных байтов, которые должны быть распределены в конце структуры класса для хранения информации*/ int cbWndExtra; /*число дополнительных байтов, которые должны быть распределены вслед за экземпляром окна*/ HINSTANCE hInstance; /*дескриптор экземпляра, в котором находится оконная процедура для этого класса*/ HICON hIcon; //дескриптор большой пиктограммы HCURSOR hCursor; //дескриптор курсора HBRUSH hbrBackground;//дескриптор кисти LPCTSTR lpszMenuName; //указатель на строку, содержащую имя меню LPCTSTR lpszClassName;//указатель на строку, содержащую имя класса HICON hIconSm; //дескриптор малой пиктограммы} WNDCLASSEX, *PWNDCLASSEX;После формирования класса окна, его необходимо зарегистрировать в системе. Для этого применяется функция API RegisterClassEx().
|
|
ATOM RegisterClassEx (CONST WNDCLASSEX * lpWndClass);
Единственный параметр должен содержать адрес структуры класса окна. В случае удачной регистрации возвращается уникальный идентификатор зарегистрированного класса. Анрегистрация классов происходит при закрытии приложения.
Стили класса, стили окна
Стиль создаваемого окна определяется параметром UINT style при описании оконного класса. Стиль создаваемого окна определяется параметром dwStyle у функции HWND CreateWindow(…)
Стиль | Описание |
CS_BYTEALIGNCLIENT | Выравнивать клиентскую область окна в горизонтальном направлении по границе байта для повышения производительности вывода. Влияет на ширину окна и его горизонтальную позицию на дисплее. |
CS_BYTEALIGNWINDOW | Выравнивать окно в горизонтальном направлении по границе байта. |
CS_CLASSDC | Распределить один контекст устройства для совместного использования всеми классами окна. Если несколько нитей в приложении будут пытаться использовать DC одновременно, система Windows разрешит успешно выполнить работу только одной нити. |
CS_DBLCLKS | Извещает окно, когда происходит двойной щелчок. |
CS_GLOBALCLASS | Создать класс, доступный всем приложениям (во время работы данного приложения, создавшего этот класс). |
CS_HREDRAW | Перерисовывать все окно, если изменен размер по горизонтали. |
CS_NOCLOSE | Запретить команду Close в системном меню. |
CS_OWNDC | Распределить уникальный контекст устройства для каждого окна, которое создано с помощью этого класса. |
CS_PARENTDC | Каждое окно, созданное с использованием этого класса, будет использовать контекст устройства родительского окна. |
CS_SAVEBITS | Сохранить в виде растрового рисунка часть экранного изображения, затененного окном. Этот растровый рисунок используется для воссоздания изображения на экране после удаления окна. |
CS_VREDRAW | Перерисовывать все окно, если изменен размер по вертикали. |
Таблица №1 Стили класса окна
|
|
Стиль | Описание |
WS_BORDER | Создание окна с рамкой в виде тонкой линии |
WS_CAPTION | Создание окна с заголовком (невозможно использовать одновременно со стилем WS_DLGFRAME). Включает стиль WS_BORDER |
WS_CHILD WS_CHILDWINDOW | Создание дочернего окна (невозможно использовать одновременно со стилем WS_POPUP). |
WS_CLIPCHILDREN | Исключает область, занятую дочерним окном, при выводе в родительское окно. |
WS_CLIPSIBLINGS | Используется совместно со стилем WS_CHILD для отрисовки в дочернем окне областей клипа, перекрываемых другими окнами. |
WS_DISABLED | Создает окно, которое недоступно. |
WS_DLGFRAME | Создает окно с двойной рамкой, без заголовка. |
WS_GROUP | Позволяет объединять элементы управления в группы. |
WS_HSCROLL | Создает окно с горизонтальной полосой прокрутки. |
WS_MAXIMIZE | Создает окно максимального размера. |
WS_MAXIMIZEBOX | Создает окно с кнопкой развертывания окна. |
WS_MINIMIZE WS_ICONIC | Создает первоначально свернутое окно (используется только со стилем WS_OWERLAPPED). |
WS_MINIMIZEBOX | Создает окно с кнопкой свертывания. |
WS_OVERLAPPED | Создает перекрывающееся окно (которое, как правило, имеет заголовок и WS_TILED рамку). |
WS_OVERLAPPED WINDOW | Создает перекрывающееся окно, имеющее стили WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX. |
WS_POPUP | Создает popup-окно (невозможно использовать совместно со стилем WS_CHILD). |
WS_POPUPWINDOW | Создает popup-окно, имеющее стили WS_BORDER, WS_POPUP, WS_SYSMENU. |
WS_SYSMENU | Создает окно с кнопкой системного меню (можно использовать только с окнами имеющими строку заголовка). |
WS_TABSTOP | Определяет элементы управления, переход к которым может быть выполнен по клавише TAB. |
WS_THICKFRAME WS_SIZEBOX | Создает окно с рамкой, используемой для изменения размера окна. |
WS_VISIBLE | Создает первоначально отображаемое окно. |
WS_VSCROLL | Создает окно с вертикальной полосой прокрутки. |
Таблица №2 Стили окна