创建一个具有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。

最佳答案

插入符号也被认为是一个控件。不要将WS_EX_COMPOSITED用于顶层窗口。要么将其用于特定的问题控制。

或忽略控件的WndProc中的WM_ERASEBACKGROUND,该控件的前台内容覆盖整个客户区域,并且在调整大小时控件会闪烁。

关于c - WS_EX_COMPOSITED导致意外的WM_PAINT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18734761/

10-11 00:13