Читайте также:
|
|
В программе (первый код в вопросе 84) практически вся функциональность приложения сосредоточена (и скрыта) внутри функции MessageBox. Для лучшего понимания структуры приложения сделаем реализацию поведения видимой, другими словами, создадим окно, которым будем управлять сами, а не доверять это функции MessageBox.
Окно новой версии hello.cpp показано на рис. Теперь слова "Hello, World!" выводятся как надпись на кнопке, занимающей всю клиентскую область окна (они также появляются в строке заголовка окна).
"Типичное" приложение Windows в процессе инициализации сначала регист рирует новый оконный класс для своего главного окна. Затем приложение создает свое главное окно. Сейчас пока не будем регистрировать новый оконный класс, а используем один из стандартных оконных классов, BUTTON ("Кнопка"). Поведение этого класса не позволит в точности повторить приложение из п.1. В данный момент это неважно, главное, что в приложении можно будет увидеть назначение цикла обработки сообщений.
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE d2, LPSTR d3, int d4)
{
HWND hwnd;
hwnd = CreateWindow("BUTTON", "Hello, World!",
WS_VISIBLE | BS_CENTER, 100, 100, 100, 80,
NULL, NULL, hInstance, NULL);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (msg.message == WM_LBUTTONUP)
{
DestroyWindow(hwnd);
PostQuitMessage(0);
}
DispatchMessage(&msg);
}
return msg.wParam;
}
В данном примере виден цикл обработки сообщений. После создания окна программа входит в цикл while, в котором выполняется вызов функции Windows API для получения очередного сообщения – GetMessage. Эта функция возвращает значение FALSE только при получении сообщения WM_QUIT о завершении приложения. В цикле обрабатывается единственное сообщение, WM_LBUTTONUP, об отпускании левой кнопки мыши. Функция DestroyWindow уничтожает окно приложения, а PostQuitMessage посылает приложению сообщение WM_QUIT. Поэтому при очередном вызове GetMessage цикл обработки сообщений завершится. Все сообщения, кроме WM_LBUTTONUP, передаются функции DispatchMessage.
Диспетчеризация с помощью функции DispatchMessage означает передачу сообщений в оконную процедуру, "по умолчанию" приписанную оконному классу BUTTON. Как и в случае функции MessageBox, содержание оконной процедуры "по умолчанию" скрыто, т.к. она является частью операционной системы.
Обратите внимание, что приложение 1(вопрос 84) завершает работу, только если указатель в момент отпускания левой кнопки находится над кнопкой. В новой версии приложения выход из программы осуществляется по сообщению об отпускании левой кнопки, независимо от положения указателя.
Среди других полезных виртуальных функций CWinApp можно назвать OnIdle, Run и PreTranslateMessage. OnIdle удобна для выполнения некоторой фоновой обработки, вроде обновления каких-либо индикаторов. Слово "idle" переводится как "ожидание, простой". Эта функция вызывается, когда очередь сообщений потока пуста. Поэтому OnIdle является удобным механизмом выполнения фоновых задач с низким приоритетом, не требующих отдельного исполняемого потока.
Функцию Run можно перегрузить с целью модификации цикла обработки сообщений, но это делается редко. Если надо выполнить некоторую специфическую предварительную обработку некоторых сообщений до их диспетчеризации, то достаточно перегрузить PreTranslateMessage и не изменять цикл обработки сообщений.
Оконные классы – это шаблоны, хранящие информацию о свойствах окна. Среди этих свойств – начальные размеры окна, его пиктограмма, курсор и меню. Вероятно, самое главное свойство – это адрес функции, называемой оконной процедурой.
Приложение обычно выполняет обработку полученных сообщений с помощью вызова функции DispatchMessage из Win API. Функция DispatchMessage, в свою очередь, вызывает соответствующую оконную процедуру. Адрес оконной процедуры при этом извлекается из оконного класса окна, которому послано сообщение. Именно оконная процедура выполняет обработку всех сообщений, посылаемых окну.
В Windows есть много стандартных оконных классов, например, стандартные
элементы управления вроде кнопок (класс Button) и строк ввода (класс Edit).
Дата добавления: 2015-09-03; просмотров: 85 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Создание окна с помощью функции CreateWindow | | | Схема последовательного технологического процесса |