WM_PAINT事件可以說是最常見的一種Window事件之一。它提示了窗口的刷新,當窗口需要繪制時,就會發出。
窗口的繪制的觸發有很多種

  • 從最小化回復
  • 窗口大小改變
  • 變為關注的窗口

例子 1

1
2
3
4
5
6
7
8
9
10
11
12
13
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW; // CS_HREDRAW: 垂直方向大小改變時,會重新draw
// CS_VREDRAW: 水平方向大小改變時,會重新draw
// ...

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_PAINT:
OutputDebugStringA ("Paint\n");
break;
}
return DefWindowProc (hwnd, msg, wParam, lParam);
}

style設置好後,當垂直以及水平方向的大小改變時,就會發出WM_PAINT

例子 2

1
2
3
4
5
6
7
8
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_PAINT:
MessageBox (0, L"Hello World", L"Hello", MB_OK);
break;
}
return DefWindowProc (hwnd, msg, wParam, lParam);
}

MessageBox會導致當前控制的主窗口變為MessageBox。關閉MessageBox後,主窗口變回應用程序的窗口,這時候窗口需要ReDraw,因此發出WM_PAINT。這種情況會變成死循環。

WM_PAINTはWindowが描画するとき、発送します。
Windowを描画する場合

  • Minimiseから回復するとき
  • Windowのサイズが変更するとき
  • 注目するWindowになるとき

例 1

1
2
3
4
5
6
7
8
9
10
11
12
13
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW; // CS_HREDRAW: 垂直方向のサイズが変更する時、再描画
// CS_VREDRAW: 水平方向のサイズが変更する時、再描画
// ...

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_PAINT:
OutputDebugStringA ("Paint\n");
break;
}
return DefWindowProc (hwnd, msg, wParam, lParam);
}

styleをセットして、垂直や水平の方向のサイズが変わると、WM_PAINTを発送する。

例 2

1
2
3
4
5
6
7
8
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_PAINT:
MessageBox (0, L"Hello World", L"Hello", MB_OK);
break;
}
return DefWindowProc (hwnd, msg, wParam, lParam);
}

MessageBoxが表示している場合、Main WindowはMessageBoxになります。MessageBoxを閉じると、Main WindowはまたアプリケーションのWindowになって再描画します。そのため、WM_PAINTを発送します。上のコード場合、無限ループになってしまいます。