gpt4 book ai didi

c - WS_EX_COMPOSITED 导致意外的 WM_PAINT

转载 作者:可可西里 更新时间:2023-11-01 13:47:14 24 4
gpt4 key购买 nike

创建一个 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返回的paint结构是

WM_PAINT : invaliate rect width = 2, height = 12

这只是插入符号的宽度和高度。总之,WM_PAINT 用于闪烁插入符号。

但是如果我从窗口的额外样式中删除 WM_EX_COMPOSITED 样式,就不再有无限的 WM_PAINT 了。

这是windows的bug吗?

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

最佳答案

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

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

关于c - WS_EX_COMPOSITED 导致意外的 WM_PAINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18734761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com