Программирование для Windows NT

Обработка сообщения WM_PAINT


Обработчик сообщения WM_PAINT получает управление, когда возникает необходимость перерисовать внутреннюю область дочернего MDI-окна. Однако заметим, что в то же самое время во внутренней области дочернего окна может рисовать функция задачи, запущенная для этого окна. В результате возникает необходимость выполнить синхронизацию главной задачи приложения и задачи дочернего окна.

Так как задачи, запущенные для дочерних окон, работают независимо друг от друга и от главной задачи приложения, мы будем выполнять синхронизацию каждой задачи при помощи отдельной критической секции. Эта критическая секция располагается в структуре типа CHILD_WINDOW_TAG и ее инициализация была выполнена перед созданием соответствующей задачи.

Для получения адреса структуры, который был записан в память дочернего окна, мы вызываем функцию GetWindowLong:

lpMyWndTag = (LPCHILD_WINDOW_TAG)GetWindowLong(hwnd, GWL_USERDATA);

После этого выполняется вход в критическую секцию, получение контекста отображения, рисование во внутренней области дочернего MDI-окна строки Child Window, освобождение контекста отображения и выход из критической секции:

EnterCriticalSection(&(lpMyWndTag->csChildWindowPaint));

hdc = BeginPaint(hwnd, &ps);

GetClientRect(hwnd, &rc);

DrawText(hdc, "Child Window", -1, &rc,

  DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint(hwnd, &ps);

LeaveCriticalSection(&(lpMyWndTag->csChildWindowPaint));



Содержание раздела