1

hwndTocBox(左のパネル)hwndSplitterhwndCanvas(右のパネル) の3つの子を持つメインウィンドウがあります。TreeViewコントロールであるhwndTocBox子があります。hwndTreeView右にドラッグhwndSplitterすると(つまり、大きくしたいhwndTocBoxのでhwndTreeView)、とのコンテンツ(および背景?)はhwndCanvasしばらくhwndSplitter残ります。(スプリッターを左にドラッグしても全く問題ありません。)

hwndSplitterをドラッグすると、サイズ変更とDeferWindowPos()移動hwndTocBoxに使用されます。がサイズ変更されると、そのWindowsプロシージャの場合、サイズが変更されます(サイズ変更だけでなく、他のサイズも変更されるため、引き続きを使用します)。hwndSplitterhwndCanvashwndTocBoxWM_SIZEhwndTreeViewDeferWindowPos()hwndTreeView

CLIPCHILDRENといくつかの場所で使用しようとしWS_CLIPSIBLINGSましたが、問題は解決しません。

なぜ内容がしばらくそこに残り、後で消去されるのですか?

この問題を解決する方法を教えてください。

ここに画像の説明を入力してください

4

1 に答える 1

2

サイズを変更したウィンドウの部分を再描画する必要があります。そうしないと、これらの奇妙なアーティファクトが発生します。彼らが塗抹標本のように見えるのには理由があります、なぜならそれは彼らがほとんど正確であるからです。コンテンツの特定の部分がペイントされ、通常どおり画面に表示されました。次に、ウィンドウのサイズを変更しました。すでに塗っていた部分は無効にしなかったので塗り直しはしませんでしたが、新しく露出した部分は前に何もなかったので塗り直しが必要でした。

修正は簡単です。サイズ変更コードの下部にInvalidateRect()関数の呼び出しを追加して、ウィンドウが次にメッセージを処理するときに、サイズ変更しているウィンドウの部分が再描画されるようにしWM_PAINTます。

メッセージがすぐに処理されることを確認したい場合WM_PAINT(ウィンドウの影響を受ける領域がすぐに再描画される結果になる)、UpdateWindow()関数の呼び出しでフォローアップします。しかし、これは本当に必要ではないはずです。少しずつ行うよりも、すべての再描画を後ですべてが完成したときに延期する方がはるかに効率的です。相対的に言えば、ウィンドウの塗り直しはコストのかかる操作です。

于 2012-07-23T23:35:15.643 に答える