Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI-ekz_shpory.docx
Скачиваний:
11
Добавлен:
25.09.2019
Размер:
185.19 Кб
Скачать
  1. Сообщения. Цикл сообщений, основные компоненты.

  2. typedef struct tagMSG

  3. {

  4. HWND hwnd;

  5. UINT message;

  6. WPARAM wParam;

  7. LPARAM lParam;

  8. DWORD time;

  9. POINT pt;

  10. } MSG;

Сообщение - это извещение о некотором имевшем место событии, посылаемое системой Windows – они информируют Windows или приложение, что произошло какое-то событие (например, произошло нажатие клавиши). Также сообщение может быть послано или получено от другого пользователя или Windows

Для каждого приложения создается своя очередь сообщений. Очередь сообщения приложений может пополняться не только из системной очереди сообщений. Любое приложение может послать сообщение любому другому сообщению, в том числе и само себе.

Основная работа, которую должно выполнять приложение, заключается в обслуживании собственной очереди сообщений. Обычно приложение в цикле, называемом циклом сообщений, опрашивает свою очередь сообщений (каждая программа должна иметь функцию обработки сообщений).

Функция WinMain в цикле обработки сообщений с помощью функции GetMessage выбирает сообщения из очереди сообщений приложения и распределяет их функциям окон, вызывая функцию DispatchMessage.

Функция GetMessage предназначена для выборки сообщения из очереди приложения. Сообщение выбирается из очереди и записывается в область данных, принадлежащую приложению.

Функция TranslateMessage занимается обработкой клавишных команд.

Функция DispatchMessage предназначена для распределения выбранного из очереди сообщения нужной функции окна (определяет, какой функции окна отправить сообщение). Так как приложение обычно создает много окон и эти окна используют различные функции окна, необходимо распределить сообщение именно тому окну, для которого оно предназначено. Поэтому приложение должно распределить сообщение после его выборки из очереди приложения, в котором находятся сообщения для всех окон. Затем управление передается Windows, и он вызывает обработчик. Обработчик дополняется кодом и начинает работать в составе ОС.

Типичный цикл сообщений:

MSG msg; // Структура для временного хранения информации о сообщении.

while(GetMessage(&msg, 0, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

  1. Сообщения. Структура сообщений на примере wm_command

Сообщение - это извещение о некотором имевшем место событии, посылаемое системой Windows – они информируют Windows или приложение, что произошло какое-то событие (например, произошло нажатие клавиши). Также сообщение может быть послано или получено от другого пользователя или Windows.

Сообщение WM_COMMAND

idItem = wParam; /* control or menu item identifier */

hwndCtl = (HWND) LOWORD(lParam); /* handle of control */

wNotifyCode = HIWORD(lParam); /* notification message */

The WM_COMMAND message is sent to a window when the user selects an item from a menu, when a control sends a notification message

Сообщение с кодом WM_COMMAND передается функции родительского окна от органа управления, созданного этим окном. При создании органа управления (например, кнопки на базе класса "button") вызывается функция CreateWindow, которой указываете идентификатор родительского окна и идентификатор органа управления.

Если орган управления изменяет свое состояние (например, когда вы нажали на кнопку), функция родительского окна получает сообщение WM_COMMAND. Вместе с этим сообщением функция родительского окна получает в параметре wParam идентификатор органа управления. Младшее слово параметра lParam содержит идентификатор дочернего окна, т. е. идентификатор окна органа управления. Старшее слово lParam содержит код извещения от органа управления (notification code), по которому можно судить о том, какое действие было выполнено над органом управления.

Когда вы нажимаете на кнопку, родительское окно получает сообщение WM_COMMAND с кодом извещения, равным BN_CLICKED. Получив такое сообщение, приложение определяет, что была нажата кнопка, идентификатор которой находится в параметре wParam.

Или, если у нас создано меню с помощью шаблона, то мы можем получить это сообщение при выборе пункта системного меню. wParam содержит идентификатор строки, определенной в шаблоне меню.

Пример обработки сообщения WM_COMMAND:

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

switch (iMessage)

{

// Осуществим обработку выбранного пункта меню

case WM_COMMAND:

{

switch (wParam)

{

// Сообщения от меню

case IDM_FIVE:

break;

case IDM_FOUR:

{

PostQuitMessage(0);

break;

}

}

}

default:

return DefWindowProc(hWnd, iMessage, wParam, lParam);

}

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]