微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个带有选项卡控件的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解决了问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐