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

标签 user-interface winapi resize flicker

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

  • 在主 wndproc 中处理 WM_ERASEBKGND 并返回 TRUE。没有效果。
  • 过滤掉事件循环中的所有 WM_ERASEBKGND 消息。没有效果。
  • 在主窗口上设置 WM_CLIPCHILDREN 样式。现在,当窗口调整大小时, ListView 控件会被简单地删除为白色背景并且不会重绘。
  • 使用 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);
    

    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);
    

    样式如下:
  • 主窗口:WS_OVERLAPPEDWINDOW
  • 选项卡控件:WS_CHILD (和 WS_VISIBLE )
  • ListView 控件:WS_CHILD | WS_BORDER | LVS_REPORT (和 WS_VISIBLE )
  • 最佳答案

    事实证明 Z 排序存在问题 - 在 ListView 上调用 BringWindowToTop 解决了这个问题。

    关于user-interface - Win32 GUI 在调整大小时闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2036599/

    相关文章:

    python-3.x - 一次运行后 Tkinter 窗口自动关闭

    python - GUI 表单编辑器

    c++ - CreateFont、DeleteObject 和 GDI 句柄/内存泄漏

    java - GridBag布局和调整大小

    javascript - javascript 的“媒体查询” - 不同视口(viewport)高度/宽度的不同代码

    c++ - 通过成员函数保持来自 fstream 的流打开

    javascript - "let me google that for you"站点如何制作动画鼠标?

    c++ - 单独线程中的 GetDC 函数返回时间太长

    c - 如何调用 LocalFree()?

    不同分辨率缩放布局的Android调整大小按钮