调整大小时Win32 GUI闪烁

wj3*_*j32 5 user-interface winapi resize flicker

我有一个带有选项卡控件的Win32 GUI程序,每个选项卡都有一个列表视图控件.每当调整窗口大小时,都会出现大量闪烁.我尝试过以下的事情:

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

这是RegisterClassEx代码:

memset(&wcex, 0, 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, 16, 0);
Run Code Online (Sandbox Code Playgroud)

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, rect.left, rect.top,
    rect.right - rect.left, rect.bottom - rect.top, TRUE);
Run Code Online (Sandbox Code Playgroud)

风格如下:

  • 主窗口: WS_OVERLAPPEDWINDOW
  • 标签控件:( WS_CHILDWS_VISIBLE)
  • 列表视图控件:( WS_CHILD | WS_BORDER | LVS_REPORTWS_VISIBLE)

wj3*_*j32 5

事实证明,Z 排序存在问题 - 在列表视图上调用 BringWindowToTop 解决了该问题。

  • 我也遇到了类似的闪烁(调整大小)选项卡控件本身的问题。通过向父对话框添加“WS_CLIPCHILDREN”样式解决了这个问题。 (5认同)