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