WS_EX_COMPOSITED会导致意外的WM_PAINT

时间:2013-09-11 07:07:09

标签: c windows winapi user-interface

使用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:test enviroment windows 7 64bit + visual studio 2012。

1 个答案:

答案 0 :(得分:1)

插入符号也被视为对照。不要将WS_EX_COMPOSITED用于顶级窗口。要么将它用于特定的有问题的控制。

或者忽略控件的WndProc中的WM_ERASEBACKGROUND,其前景内容覆盖整个客户区域,并且当您调整大小时控件会闪烁。