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的bug吗?

PS:测试环境windows 7 64bit + visual studio 2012。

4

1 回答 1

2

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

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

于 2014-03-03T02:11:40.293 回答