Структура MSG. Обработка сообщений.
Для временного хранения сообщений в Windows используется структура типа MSG. Переменная этого типа, в частности, используется в цикле обработки сообщения (здесь сообщений хранится до окончания обработки).
В файле windows.h структура MSG описана следующим образом:
typedef struct tagMSG{ HWND hwnd; // Дескриптор приложения, которому отправлено сообщение UINT message; // Номер (идентификатор) сообщения (какое сообщение послано) WPARAM wParam; // Информационные поля - LPARAM lParam; // содержат информацию. Какое событие произошло DWORD time; // Время от запуска ОС до постановки в системную очередь сообщения POINT pt; // Указатель на структуру с двумя полями x, y – координаты мыши} MSG; Обработка сообщенийВ Windows-приложении для обработки сообщений создается специальная функция:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ // Идентификатор сообщения передается через параметр msg wParam и lParam –информационные поля сообщения. switch (msg) { case WM_DESTROY: { // Инициируем завершение работы приложения, помещая в очередь приложения сообщение WM_QUIT. Это приведет к завершению цикла обработки сообщений в функции WinMain PostQuitMessage(0); return 0; } default: DefWindowProc(hwnd, msg, wParam, lParam); // Все сообщения, которые не обрабатываются нашей функцией окна, ДОЛЖНЫ передаваться функции DefWindowProc }}LRESULT – функция возвращает двойное слово.CALLBACK – модификатор функции обратного вызова {передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет в функции исполнять код, который задаётся в аргументах при её вызове} Функция WndProc НЕ ВЫЗЫВАЕТСЯ ни из одной функции приложения. Эту функцию вызывает Windows в процессе обработки сообщений. Для этого адрес функции WndProc указывается при регистрации класса окна. Функция выполняет обработку сообщений главного окна приложения.В Windows также происходит обработка сообщений собственными обработчиками сообщений Windows по умолчанию.Средства обработки сообщений в приложении и WINDOWS.
В Windows-приложении для обработки сообщений создается специальная функция:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ // Идентификатор сообщения передается через параметр msg wParam и lParam –информационные поля сообщения. switch (msg) { case WM_DESTROY: { // Инициируем завершение работы приложения, помещая в очередь приложения сообщение WM_QUIT. Это приведет к завершению цикла обработки сообщений в функции WinMain PostQuitMessage(0); return 0; } default: DefWindowProc(hwnd, msg, wParam, lParam); // Все сообщения, которые не обрабатываются нашей функцией окна, ДОЛЖНЫ передаваться функции DefWindowProc }}LRESULT – функция возвращает двойное слово.CALLBACK – модификатор функции обратного вызова {передача исполняемого кода в качестве одного из параметров другого кода. Обратный вызов позволяет в функции исполнять код, который задаётся в аргументах при её вызове} Функция WndProc НЕ ВЫЗЫВАЕТСЯ ни из одной функции приложения. Эту функцию вызывает Windows в процессе обработки сообщений. Для этого адрес функции WndProc указывается при регистрации класса окна. Функция выполняет обработку сообщений главного окна приложения.В Windows также происходит обработка сообщений собственными обработчиками сообщений Windows по умолчанию.Окна, классы и типы окон.
Окна – основной объект в Windows. С точки зрения пользователя Windows окном является прямоугольная область экрана, в которой приложение может что-либо рисовать или писать, а также выполнять все операции взаимодействия с пользователем. Любое приложение Windows можно рассматривать как совокупность окон, внутри которых можно что-либо рисовать или писать. Для каждого окна в приложении определены данные и методы, предназначенные для работы с этими данными (в частности, для рисования в окне).
В ООП используется понятие наследования. Объекты могут наследовать методы других объектов. В Windows также предусмотрен такой механизм, реализуемый с использованием, так называемых, классов окна.
Для каждого класса окна определяется функция окна. При создании окна необходимо указать, к какому классу оно будет принадлежать и, соответственно, какую функцию окна будет использовать для обработки сообщений. Приложения могут создавать собственные классы окна, определяя свои функции окна (и, следовательно, свои методы), либо использовать стандартные, определенные в Windows, классы окна.
Любое создаваемое окно может наследовать свойства уже созданных ранее окон, добавляя свои или переопределяя уже имеющиеся в базовом классе методы. В этом и заключается механизм наследования Windows.
Классы окон имеют стили. Вот ряд из них:
1) CS_DBLCLKS – функция окна будет получать сообщение по двойному щелчку мыши
2) CS_GLOBALCLASS – класс является глобальным и доступен другим приложениям
3) CS_HREDRAW И CS_VREDRAW – внутренняя часть окна будет перерисовываться при изменении ширины и высоты окна
4) CS_NOCLOSE – в системном меню запрещена функция ция закрытия окна
5) CS_CLASSDC – создается единый контекст отображения, который будет использоваться всеми окнами, создаваемыми на базе данного класса
6) CS_OWNDC – для каждого окна, создаваемого на базе данного класса, будет создаваться отдельный контекст отображения.
Определенный в классе окна стиль класса окна используется при создании на базе этого класса всех окон. Для дальнейшего уточнения внешнего вида и поведения окна используется другая характеристика - стиль окна. Стиль окна указывается при создании окна функцией CreateWindow.
Для определения стиля окна используются символические константы с префиксом WS_, определенные в файле windows.h. С помощью этих констант можно определить примерно два десятка стилей окна, однако чаще всего используются несколько основных стилей.
Мы рассмотрим три основных стиля (типа) окон - перекрывающиеся окна (overlapped window), временные окна (pop-up window) и дочерние окна (child window) – несовместимы между собой.
Стили окна:
1) Перекрывающиеся окна WS_OVERLAPPEDWINDOW – используются в качестве главного окна приложения, обязательно имеют заголовок, рамку, внутреннюю часть (клиентская область), рамку. Дополнительно могут иметь – системное меню, полосы прокрутки, кнопки свертки и т.д.
2) Временные окна WS_POPUP – для вывода сообщений, остаются на экране непродолжительное время. Может иметь или не иметь заголовок, системное меню.
Окно (временное, перекрывающееся) может быть окном–владельцем (если оно сворачивается в пиктограмму, все окна, которыми оно владеет, становятся невидимыми, если уничтожить – уничтожаться и подчиненные, подчиненные окна располагаются всегда над поверхностью окна-владельца, загораживая его). Оба типа окна используют экранные координаты.
3) Дочерние окна WS_CHILD – для создания органов управления, напр. кнопки, переключатели. Обычно не имеют рамок, заголовков и т.д. Всегда располагаются на поверхности окна-родителя, система координат – в верхнем левом углу окна-родителя. Только дочерние окна (9-й параметр CreateWindow), могут иметь родителей, перекрывающие и временные окна могут иметь окно-хозяина (8-й параметр CreateWindow).
Другие стили: WS_BORDER, WS_CAPTION, WS_HSCROLL, WS_MAXIMIZE, WS_VISIBLE, WS_MINIMIZE, WS_VSCROLL и другие.