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