Win32 GUI 在调整大小时闪烁 [英] Win32 GUI flickering on resize

查看:88
本文介绍了Win32 GUI 在调整大小时闪烁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a Win32 GUI program with a tab control, each tab having a list view control. There is massive flickering whenever the window is resized. I've tried the following things:

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

这是 RegisterClassEx 代码:

Here's the RegisterClassEx code:

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 处理程序:

The WM_SIZE handler:

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)
  • 列表视图控件:WS_CHILD |WS_BORDER |LVS_REPORT(和 WS_VISIBLE)
  • Main window: WS_OVERLAPPEDWINDOW
  • Tab control: WS_CHILD (and WS_VISIBLE)
  • List view control: WS_CHILD | WS_BORDER | LVS_REPORT (and WS_VISIBLE)

推荐答案

原来是 Z-ordering 有问题 - 在列表视图上调用BringWindowToTop 解决了这个问题.

It turned out there was a problem with the Z-ordering - calling BringWindowToTop on the list view solved the problem.

这篇关于Win32 GUI 在调整大小时闪烁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆