我有一个带有选项卡控件的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)