2

サーバーからのデータの受信とレンダリングが完了するまで、ウィンドウが更新されないようにしたいのですが。WM_PAINTイベントをフックすることはできますか、それともWin32APIメソッドを呼び出して、ウィンドウが更新されないようにし、後でフリーズを解除することをお勧めしますか?

詳細: C#で記述されたMMCスナップインのコンテキストでは、アプリケーションは厄介なちらつきと二重ソート動作に悩まされています。MMCのlistViewsを使用していますが、sortイベントをサブスクライブしているためです。MMCは独自の魔法を実行し、表示されているページを並べ替えます(これをオーバーライドすることはできません)。サーバーから応答を受信すると、listViewを再度変更します。各行の変更は順番に行われ、beginUpdateなどはありません(AFAIK)。

4

3 に答える 3

1

通常WM_PAINTは接続する方法ですが、すべての通知も無視するようにしてください。無視しWM_ERASEBKGNDないと、WindowsがWindows領域を消去するため、ちらつきが発生します。(Windowsがそれを行わないようにするには、ゼロ以外を返します)

もう1つの可能性は関数を使用するLockWindowUpdateことですが、いくつかの欠点があります。

  • ロックできるウィンドウは1つだけです
  • デスクトップ全体のロックを解除すると、すべてのサブウィンドウ(つまりすべて)が再描画され、デスクトップ全体が短時間フラッシュされます。(VistaよりもXPの方が悪いです)
于 2009-10-11T14:08:37.127 に答える
1

一部のコントロールには、この目的のためのAPIがBeginUpdateあります。EndUpdate

何かを行う場合(たとえば、フックしてペイントイベントを無視する場合)、ペイントを無効にします。後で強制的に再ペイントする方法は、Invalidateメソッドを呼び出すことです。

于 2009-10-11T14:09:03.320 に答える
0

OK、すべての検索とチェックの結果、LockUpdateWindow は悪い考えであることがわかりました。たとえば、Raimond Chen OldNewThingの記事を参照してください。しかし、SetRedrawWindow のアイデアを実装することさえ、それほど単純ではありませんでした。なぜなら、私が持っていたものは、メイン ウィンドウの IConsole2* pConsole->GetMainWindow() HWND ハンドラーからしか受け取っていなかったからです。SetRedraw = FALSE に設定すると、非常に奇妙な方法で消えました。アプリケーション全体ではなく、TreeView に対してのみプロシージャを実行するようにしますが (私たちの左側のパネル)、私は実行しました

EnumChildWindows(hWnd, SetChildRedraw, FALSE); //stopping redraw
//... here you do your operations
EnumChildWindows(hWnd, SetChildRedraw, TRUE); //restarting redraw

ここで、SetChildRedraw コールバックは次の方法で定義されました。

#define DECLARE_STRING(str) TCHAR str[MAX_PATH]; ZeroMemory(str, sizeof(str));
BOOL CALLBACK SetChildRedraw(HWND hwndChild, LPARAM lParam) 
{ 
    RECT rcChildRect; ZeroMemory(&rcChildRect, sizeof(rcChildRect));
    DECLARE_STRING(sText)
    GetClassName(hwndChild, sText, MAX_PATH);
    if (wcsstr(sText, L"SysTreeView32") != NULL)
    {
        SetWindowRedraw(hwndChild, lParam);
        if (lParam == TRUE)
        {
            GetWindowRect(hwndChild, &rcChildRect);
            InvalidateRect(hwndChild, &rcChildRect, TRUE);
        }
    }
    return TRUE;
}
于 2010-12-15T07:12:38.117 に答える