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

user-interface – 调整大小时Win32 GUI闪烁

发布时间:2020-12-14 01:58:17 所属栏目:Windows 来源:网络整理
导读:我有一个带有选项卡控件的Win32 GUI程序,每个选项卡都有一个列表视图控件.每当调整窗口大小时,都会出现大量闪烁.我尝试过以下的事情: 在主wndproc中处理WM_ERASEBKGND并返回TRUE.没有效果. 过滤掉事件循环中的所有WM_ERASEBKGND消息.没有效果. 在主窗口上设
我有一个带有选项卡控件的Win32 GUI程序,每个选项卡都有一个列表视图控件.每当调整窗口大小时,都会出现大量闪烁.我尝试过以下的事情:

>在主wndproc中处理WM_ERASEBKGND并返回TRUE.没有效果.
>过滤掉事件循环中的所有WM_ERASEBKGND消息.没有效果.
>在主窗口上设置WM_CLIPCHILDREN样式.现在,当调整窗口大小时,列表视图控件将被简单地擦除为白色背景并且不会重绘.
>使用DefWindowPos而不是MoveWindow.没有效果.
>在MoveWindow中为bRepaint传递FALSE.与设置WS_CLIPCHILDREN相同(见上文).

这是RegisterClassEx代码:

memset(&wcex,sizeof(WNDCLASSEX));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = PhMainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = PhInstanceHandle;
wcex.hIcon = LoadIcon(PhInstanceHandle,MAKEINTRESOURCE(IDI_PROCESSHACKER));
wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
//wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MAINWND);
wcex.lpszClassName = PhWindowClassName;
wcex.hIconSm = (HICON)LoadImage(PhInstanceHandle,MAKEINTRESOURCE(IDI_PROCESSHACKER),IMAGE_ICON,16,0);

WM_SIZE处理程序:

RECT rect;

// Resize the tab control.

GetClientRect(PhMainWndHandle,&rect);
MoveWindow(TabControlHandle,rect.left,rect.top,rect.right - rect.left,rect.bottom - rect.top,TRUE);

// Resize the list view.

TabCtrl_AdjustRect(TabControlHandle,FALSE,&rect);

MoveWindow(ListViewHandle,TRUE);

风格如下:

>主窗口:WS_OVERLAPPEDWINDOW
>选项卡控件:WS_CHILD(和WS_VISIBLE)
>列表视图控件:WS_CHILD | WS_BORDER | LVS_REPORT(和WS_VISIBLE)

解决方法

事实证明Z-ordering存在问题 – 在列表视图上调用BringWindowToTop解决了问题.

(编辑:李大同)

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

    推荐文章
      热点阅读