WS_EX_COMPOSITED スタイルでウィンドウを作成します。
hWnd = CreateWindowEx(WS_EX_COMPOSITED, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
ウィンドウのキャレットを設定します。
case WM_PAINT:
OutputDebugStringA("WM_PAINT");
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_SETFOCUS:
::DestroyCaret();
::CreateCaret(hWnd, NULL, 2, 12);
::SetCaretPos(200, 200);
::ShowCaret(hWnd);
break;
case WM_KILLFOCUS:
::DestroyCaret();
break;
case WM_CHAR:
::DestroyCaret();
::CreateCaret(hWnd, NULL, 2, 12);
::SetCaretPos(200, 200);
::ShowCaret(hWnd);
break;
アプリケーションを起動し、何もしません。キャレットを非表示にするか、キャレットを破棄するまで、無限の WM_PAINT になります。
Spy++ の表示: キャレットが点滅する 0x118(WM_SYSTIMER) ごとに、WM_PAINT メッセージが続きます。
BeginPaint によって返されるペイント構造は次のとおりです。
WM_PAINT : invaliate rect width = 2, height = 12
これはキャレットの幅と高さです。まとめると、WM_PAINT はキャレットを点滅させるためのものです。
しかし、ウィンドウの余分なスタイルから WM_EX_COMPOSITED スタイルを削除すると、無限の WM_PAINT はなくなります。
これはWindowsのバグですか?
PS: テスト環境は Windows 7 64 ビット + Visual Studio 2012 です。