我有一個帶有選項卡控件的Win32 GUI程序,每個選項卡都有一個列表視圖控件。每當窗口調整大小時都會有大量閃爍。我試過了以下幾件事:Win32 GUI閃爍調整大小
- 在main 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
- Tab控件:
WS_CHILD
(和WS_VISIBLE
) - 列表視圖控件:
WS_CHILD | WS_BORDER | LVS_REPORT
(和WS_VISIBLE
)
啊是的,win32窗口閃爍。這帶來回憶... – 2010-01-10 10:42:19
我不知道如果雙緩衝將有助於某種方式... – 2010-01-11 03:24:35