5

タブ コントロールを持つ 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)
4

4 に答える 4

4

Z オーダーに問題があることが判明しました。リスト ビューで BringWindowToTop を呼び出すと、問題が解決しました。

于 2010-01-15T02:59:55.000 に答える
2

Windows は、多数の子ウィンドウが個別にサイズ変更されたときに発生するちらつきを回避するためのサイズ変更バッチ操作をサポートしています。詳細については、 BeginDeferWindowPosを参照してください。

それが機能しない場合は、WM_SETREDRAWメッセージを試してください。親ウィンドウの描画を停止することは可能です。これにより、すべての子コントロールが抑制されます。レイアウトが終了したら、再度描画を有効にし、RedrawWindow を呼び出してウィンドウ全体を 1 回のパスで再描画します。これは、遅延ウィンドウの配置が内部的に使用するものだと思いました。

于 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

WindowsエクスプローラーのようにListViewがドッキングされている場合(および大量のアイテムがある場合)、メインフォームのサイズを変更すると、すべてのアイテムがちらつきます。 http://www.codeproject.com/KB/list/listviewxp.aspx

于 2010-01-10T10:26:39.690 に答える