加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

WS_EX_COMPOSITED会导致意外的WM_PAINT

发布时间:2020-12-16 07:05:46 所属栏目:百科 来源:网络整理
导读:使用WS_EX_COMPOSITED样式创建一个窗口: hWnd = CreateWindowEx(WS_EX_COMPOSITED,szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,NULL,hInstance,NULL); 为窗口设置插入符号: case WM_PAINT: OutputDebugStringA("WM_PAINT"); hdc = BeginPain
使用WS_EX_COMPOSITED样式创建一个窗口:

hWnd = CreateWindowEx(WS_EX_COMPOSITED,szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,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,2,12);
    ::SetCaretPos(200,200);
    ::ShowCaret(hWnd);
    break;
case WM_KILLFOCUS:
    ::DestroyCaret();
    break;
case WM_CHAR:
    ::DestroyCaret();
    ::CreateCaret(hWnd,200);
    ::ShowCaret(hWnd);
    break;

启动应用程序,什么都不做.他们将是一个无限的WM_PAINT,直到隐藏插入符号或插入符号.

间谍表明:
每个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 64bit visual studio 2012.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读