Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
bilety_update (1).docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
69.85 Кб
Скачать
  1. Обработка сообщений. Приложение с обработкой сообщений.

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

Сообщение представляет собой следующую структуру:

typedef struct tagMSG {

HWND   hwnd;

UINT   message;

WPARAM wParam;

LPARAM lParam;

DWORD  time;

POINT  pt;

} MSG;

Распределение сообщений между различными приложениями основано на понятии word-атрибут, который в любой момент может относиться к одному окну.

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

Сообщения от драйвера мыши всегда передаются в функцию окна, над которой находится курсор мыши.

Цикл обработки сообщений. После отображения окна функция WinMain запускает цикл обработки сообщений.

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

{

DispatchMessage(&msg);

}

Функция GetMessage выбирает сообщения из функции приложения.

1 параметр – указатель на структуру типа MSG. В нее записывается выбранное из очереди сообщение.

2 параметр – идентификатор окна, для которого необходимо выбрать сообщения. Для значения 0 будут выбираться сообщения для всех окон приложения.

3 и 4 параметры – определяют диапазон сообщений. При 0 выбираются все сообщения. Если из очереди выбираются сообщения с кодом WM_QUIT, функция возвращает сообщение со значением FALSE, что приводит к окончанию цикла выборки сообщений.

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

Приложение определяет один класс окна и на его основе создает главное окно приложения. Функция окна обрабатывает сообщения от главной клавиши мыши. В ответ на сообщения функция окна выводит диалоговую панель.

#include <windows.h>

#include <mem.h> // для работы с динамической памятью

BOOL InitApp(HINSTANCE);

LRESULT CALLBACK WndProc(HWND, HINT, WPARAM, LPARAM);

Нужны 2 глобальных массива:

charsz ClassName[] = “WindowsAppClass”;

charsz WindowTitle[] = “WindowApp”;

int WINAPI WinMain

( HINSTANCE hInstance;

HINSTANCE hPrevInstance;

LPSTR lpszCmdLine;

Int CmdShow);

{

MSG msg;

HWND hwnd;

}

И т.д. из проги.

  1. Вывод текста в окно. Контекст отображения.

Для вывода текста в окно нельзя использовать функции стандартной библиотеки, поскольку эти

функции ориентированы на консольный вывод. Windows и параллельно работающие программы должны совместно использовать экран, для этого они создают перекрывающие и перемещающие окна. Windows следит за перемещением окон и извещает приложения о необходимости перерисовки окна. В этом случае в очередь приложений записывается сообщение с кодом WN_PAINT. Приложение разрабатывается таким образом, чтобы весь вывод в окно осуществлялся при обработке сообщения WM_PAINT. Изображение, созданное при обработке других сообщений будет закрашено. Если логика работы приложения требует изменить содержимое окна в другой точке программы, то в этом случае необходимо вызвать функцию UpdateWindow(HWND hwnd) и передать ей идентификатор окна.

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

Структура данных, описывающая состояния окна, называется контекстом отображения. В этой структуре находятся отображения окна, такие как: цвет фона, цвет текста, толщина и вид линий и т.д. Контекст отображения используется функциями интерфейса графических устройств GDI, которые являются подмножеством WINAPI32. Перед выводом в окно приложение должно создать контекст отображения. Windows заполнит структуру значениями по умолчанию. Приложение может переопределять отдельные значения полей. После окончания вывода, приложение должно вызвать функцию, освобождающую контекст. С этой целью при обработке сообщений используются BeginPaint и EndPaint. При обработке других сообщений используются GetDC и ReleaseDC.

Функция вывода текста в окно:

  1. BOOL TextOut(HDC hdc, int xstart, int ystart, LPCSTR string, int len); // hdc – контекст отображения.

  1. Int WINAPI DrawText(HDC hdc, LPCSTR string, int len, RECTFAR *r, UNIT format);

  1. COLOREF WINAPI SetTextColor(HDC, COLOREF);

Пример функции:

HDC hdc, PAINTSTRUCT ps;

switch (msg)

{

case WM_PAINT:

{

hdc = BeginPaint(hwnd, &ps);

TextOut(hdc, 10, 20, “Сообщение”, 18);

EndPaint(hwnd, &ps);

return 0;

}

break;

case WM_LBUTTONDOWN:

{

hdc = GetDC(hwnd);

TextOut(hdc, 30, 40, “Сообщение”, 24);

ReleaseDC(hwnd, hdc);

return 0;

}

}

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