0

私の目的は、単一のコントロール (CMFCShellTreeCtrl) を持つ CToolBar の派生物を作成することです。

何かのようなもの:

class CFileTreeBar : public CToolBar

そのサイズを計算するように求められたときはいつでも、固定された最小値か、ドッキングされているドック バーのクライアント領域のサイズであると答えたいと思います。つまり、ドック バーの高さ全体 + 固定幅を消費する必要があります (これは左側にドッキングされています - エクスプローラーが左側にフォルダー ツリーをレイアウトするのとまったく同じです)。

したがって、CFileTreeBar::CalcFixedLayout では、GetParent()->GetWindowRect(rect) に基づく高さと 250pix の幅で応答します。

次に、OnSize で、CFileTreeBar はその CMFCShellTreeCtrl のサイズを変更して、クライアントの四角形を消費します (唯一のコントロールを最大化します)。

これは、コントロール バーが最初に表示されたときに美しく機能します。また、コーナーをドラッグしてウィンドウのサイズを変更すると、うまく機能します。CaclFixedLayout は以前の値とは異なる値を返すため (ウィンドウ サイズが変更されたため)、垂直方向のスペース全体を消費する必要があると計算され、最終的にコントロール バーのサイズを変更するように指示する WM_SIZE メッセージが表示され、サイズが更新されます。 CMFCShellTreeCtrl の。

私が苦労しているのは、CFrameWndの「最大化」ボタンを押すときです。この場合、理由がよくわかりませんが、CalcFixedLayout が呼び出されますが、ドック バーは古いサイズです (まだ最大化されていることに基づいて新しいサイズに更新されていません)。これにより、サイズが以前と同じである必要があるとコードが応答するようになります。これにより、MFC フレーム作業でサイズ変更が発行されなくなります (必要なサイズにすでになっています)。

したがって、しばらくすると、ドックバーが拡張されて垂直方向のスペース全体が消費されますが、コントロールバーとその下にあるシェルツリーのサイズは変更されませんが、古いサイズのまま残されます.

この問題は、最大化から復元に移行するときにも発生します。その時点で、CalcFixedLayout の呼び出しは、最大化されたウィンドウ (現在のサイズ) と同じ高さになる必要があることを示しており、フレームワークがサイズ変更コードを開始し、最終的にドックバーよりも大きくなります (サイズが縮小されると)。復元されたサイズに)、ドックバーの下部の下に消えます (垂直方向の最大範囲によってクリップされます)。

質問

  1. ドックバーとコントロール バーが MFC でどのように相互作用するかの概要を示す優れたチュートリアルまたはホワイト ペーパーはありますか? つまり、このフレームワークがどのように適切に機能するかについての完全な説明はありますか? これらの部品がどのように組み合わされ、首尾一貫して機能することを意図しているかを理解することは、ハッキングを回避するのに大いに役立ち、いわば丸い穴に合うように丸いものを書くことができます.
  2. 誰もが知っている、これに似たサンプル プロジェクトはありますか? このがらくたを理解しなければならないのは信じられないほど時間がかかります-これを行う例がどこかにあれば、それは素晴らしいことです...
4

1 に答える 1

2

ドッキング可能でサイズ変更可能なツールバーのコードは非常に複雑ですが、codeproject には非常に優れたものがあります。ソースコードを調べて、作成者がどのようにそれを行っているかを確認できます。

http://www.codeproject.com/Articles/6/CSizingControlBar-a-resizable-control-bar

于 2013-01-18T22:36:26.147 に答える