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解决了问题.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...