Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Приложение с циклом обработки сообщений

Читайте также:
  1. В теме 7 сообщений
  2. В чем же главные преимущества цифровых методов передачи, обработки и хранения информации?
  3. Все начинается с CObject. Важнейшие классы библиотеки. Создание приложения MFC Windows. Выбор количества окон, которые будут поддерживаться приложением.
  4. Встроенный блок эффектов обработки и эффектов модуляции
  5. Выбор семейств шрифтов. Окна сообщений Windows. Окна диалога Windows. Шрифты Windows. Растровые изображения Windows. Перья Windows. Кисти Windows.
  6. Выбор семейств шрифтов. Прием и передача сообщений Windows. Формат сообщения Windows. Как создаются сообщения Windows. Ответ на сообщение Windows. Цикл обработки сообщений.
  7. Выбрать правильный ответ. Для обработки более твердых материалов (и более глубоких отверстий) рекомендуется применять сверла с углом при вершине..

В программе (первый код в вопросе 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 | Нарушение авторских прав


Читайте в этой же книге: Некоторые функции, имеющие отношение к сообщению WM_PAINT. | Вывод окна. Изменение вида окна. Часто используемые элементы управления и диалоговые окна. Статические элементы управления. Элементы управления - кнопки. | Модальная диалоговая панель | Обмен данными диалога | Немодальная диалоговая панель | Статические органы управления | Вывод окна | Виртуальные клавиши. Системные таймеры. Срабатывание таймера. Эффективное использование механизма таймеров. | Простое приложение Windows. Оболочка для всех приложений. Эффективное использование описателей. Компоненты приложения Windows. Функция WinMain(). Регистрация класса окна. | Простое приложение Windows. style. lpfnWndProc. cbClsExtra. cbWndExtra. hinstance. hIсоn. hCursor. hbrBackground. IpszMenuName. IpszClassName. |
<== предыдущая страница | следующая страница ==>
Создание окна с помощью функции CreateWindow| Схема последовательного технологического процесса

mybiblioteka.su - 2015-2024 год. (0.006 сек.)