5

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

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_CHILDWS_VISIBLE
  • 列表视图控件:(WS_CHILD | WS_BORDER | LVS_REPORTWS_VISIBLE
4

4 回答 4

4

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

于 2010-01-15T02:59:55.000 回答
2

Windows 支持重新调整大小批处理操作,旨在避免在大量子窗口独立调整大小时导致闪烁。有关这方面的更多信息,请参阅BeginDeferWindowPos

如果这不起作用,请尝试WM_SETREDRAW消息。看起来可以停止绘制父窗口 - 这将禁止所有子控件,然后,当布局完成时,再次启用绘制,并调用 RedrawWindow 一次重绘整个窗口。我宁愿认为这是延迟窗口定位在内部使用的。

于 2010-01-10T10:13:24.007 回答
1

我可能会说显而易见的,但我认为双缓冲是 Win32 闪烁的解决方案。我是一名 Java 开发人员,我写 win32 已经有一段时间了,所以如果我在胡说八道,请告诉我

这里是如何:http ://www.gamedev.net/community/forums/topic.asp?topic_id=411559

这是一些示例代码: http: //www.codeproject.com/KB/cpp/DoubleBuffering.aspx

这是 .NET 等效问题 (?):如何防止 Windows 窗体文本框在调整大小时闪烁?

于 2010-01-10T10:26:56.677 回答
0

当 ListView 停靠时,如在 Windows 资源管理器中(并且您有大量项目),调整主窗体的大小将导致所有项目闪烁。 http://www.codeproject.com/KB/list/listviewxp.aspx

于 2010-01-10T10:26:39.690 回答