タブ コントロールを持つ Win32 GUI プログラムがあり、各タブにはリスト ビュー コントロールがあります。ウィンドウのサイズを変更するたびに、大きなちらつきがあります。私は次のことを試しました:
- メイン wndproc で WM_ERASEBKGND を処理し、TRUE を返します。無効。
- イベント ループ内のすべての WM_ERASEBKGND メッセージを除外します。無効。
- メイン ウィンドウで WM_CLIPCHILDREN スタイルを設定します。ウィンドウのサイズが変更されると、リスト ビュー コントロールは単純に白い背景に消去され、再描画されません。
- MoveWindow の代わりに DefWindowPos を使用します。無効。
- 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
) - リスト ビュー コントロール:
WS_CHILD | WS_BORDER | LVS_REPORT
(およびWS_VISIBLE
)