PAINTSTRUCT paintstruct;

В результате получаем приведённую ниже оконную функцию:

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    — была нажата средняя кнопка мыши.