5

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 です。

4

1 に答える 1

2

キャレットもコントロールと見なされます。最上位ウィンドウには WS_EX_COMPOSITED を使用しないでください。特定の問題のあるコントロールに使用します。

または、クライアント領域全体をカバーするフォアグラウンド コンテンツを持つコントロールの WndProc で WM_ERASEBACKGROUND を無視し、サイズを変更するとコントロールがちらつきます。

于 2014-03-03T02:11:40.293 に答える