使用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。
答案 0 :(得分:1)
插入符号也被视为对照。不要将WS_EX_COMPOSITED用于顶级窗口。要么将它用于特定的有问题的控制。
或者忽略控件的WndProc中的WM_ERASEBACKGROUND,其前景内容覆盖整个客户区域,并且当您调整大小时控件会闪烁。