В результате получаем приведённую ниже оконную функцию:
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HDC hdc; // контекст устройства
PAINTSTRUCT paintstruct;
switch(message)
{
case WM_CHAR:
hdc = GetDC(hwnd); // получить контекст устройства
TextOut(hdc, 1, 1, “ “, 2); // стереть старый символ
sprintf(str, “%c”, (char)wParam); // записать в буфер новый символ
TextOut(hdc, 1, 1, str, strlen(str)); // вывести на экран
ReleaseDC(hwnd, hdc); // освободить контекст устройства
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &paintstruct); //получить DC
TextOut(hdc, 1, 1, str, strlen(str));
EndPaint(hwnd, &paintstruct); //освободить DC
break;
case WM_DESTROY:
PostQuitMessage(0); //сообщение о завершении
break;
default: //обработка остальных сообщений
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
В реальных программах обработка сообщения WM_PAINT может быть намного сложнее. Она выполняется одним из трех способов:
· программа выводит при перерисовке информацию, полученную в результате некоторых вычислений;
· последовательность событий запоминается и при необходимости воспроизводится вновь для перерисовки окна;
· программа поддерживает виртуальный экран, который при перерисовке копируется в окно.
Обработка сообщений мыши. Рассмотрим наиболее часто употребляемые сообщения мыши WM_LBUTTONDOWN и WM_RBUTTONDOWN, которые поступают при нажатии соответственно левой и правой кнопок мыши. Для обработки этих сообщений в оконную функцию добавим следующие строки:
case WM_RBUTTONDOWN: // нажата правая кнопка мыши
hdc = GetDC(hwnd); // получить DC
strcpy(str, “Нажата правая кнопка”);
TextOut(hdc, LOWORD(lParam), HIWORD(lParam), str, strlen(str));
ReleaseDC(hwnd, hdc); // освободить DC
break;
case WM_LBUTTONDOWN: // нажата левая кнопка мыши
hdc = GetDC(hwnd); // получить DC
strcpy(str, “Нажата левая кнопка”);
TextOut(hdc, LOWORD(lParam), HIWORD(lParam), str, strlen(str));
ReleaseDC(hwnd, hdc); // освободить DC
break;
При нажатии кнопки мыши координаты курсора x и y передаются в lParam. Поскольку текст в данном случае выводится, начиная с позиции (LOWORD(lParam), HIWORD(lParam)), то при нажатии кнопки мыши сообщение об этом будет выводиться в текущей позиции курсора.
Параметр wParam будет содержать информацию, определенную комбинацией флагов:
MK_CONTROL — в момент нажатия кнопки мыши была нажата клавиша [Ctrl];
MK_SHIFT — то же для клавиши [SHIFT];
MK_LBUTTON — была нажата левая кнопка мыши;
MK_RBUTTON — была нажата правая кнопка мыши;
MK_MBUTTON — была нажата средняя кнопка мыши.