miniframeクラスCPaneFrameWndには、スマートドッキングアルゴリズムのバグが含まれています。 このクラスは、フローティングペインのミニフレームとしてMFCで使用され、親フレームドックサイトまたはタブ付きペインにドッキングすることができます。すべてのペインをメインフレームのみにドッキングできればうまく動作しますが、MDIアプリケーションでペインが子フレームにドッキングされると、このクラスにはバグがあります。バグを再現する手順:CPaneFrameWndのBUG(MFC Feature Pack VS 2015)
- 一部のペインをフロート状態にすると、ドッキング解除されます。 MDI子フレーム内
- 保存ドッキング状態:
GetDockingManager()->SaveState(...)
- このMDI子フレームのためのドッキング状態を復元します。
GetDockingManager()->LoadState(...); GetDockingManager()->SetDockState();
- とマウスで同じフレーム側に、このペインをドッキングしてみてください。
- これはできません。ペインはマウスでフレーム側に移動されますが、固定されていません。
CPaneFrameWndクラスソースのバグ。多くの場所で、クラスはコードm_pDockManager != NULL ? m_pDockManager : afxGlobalUtils.GetDockingManager(GetParent());
を使用してそのドックマネージャーにアクセスします。 しかし、クラスのいくつかの場所では、このコードはm_pDockManager != NULL ? m_pDockManager : afxGlobalUtils.GetDockingManager(this);
のように見えます。これはバグの理由です。グローバル関数afxGlobalUtils.GetDockingManager()はthis
ポインタからドックマネージャを取得できず、this
ポインタの親ウィンドウから取得しようとします。 pManager != NULL ? pManager : GetDockingManager(pWnd->GetParent());
のように見えます。しかし、CPaneFrameWndクラスには、afxGlobalUtils.GetDockingManager()でアクセスできないInLine NONVIRTUAL GetParent()メソッドがあります。したがって、いくつかの再帰の後で、afxGlobalUtils.GetDockingManager()はMAINアプリケーションフレームのdockmanagerを返します!もちろん、このドックマネージャーはMDI子フレームのdocmanagerと同じではありません。
正しい解決策は、CPaneFrameWndソース(afxpaneframewnd.cppファイル)のm_pDockManager != NULL ? m_pDockManager : afxGlobalUtils.GetDockingManager(this);
からm_pDockManager != NULL ? m_pDockManager : afxGlobalUtils.GetDockingManager(GetParent());
にすべて変更することです。 しかし、これにはMFCコードへのパッチが必要です。 Microsoftの怠け者は、私たちの誰もが知っています。 誰かが現在のMFCリリースでこのバグを修正する方法を知っていることがありますか?
子フレームへのドッキングがサポートされているという印象を与えたのは何ですか? –
MS – 23W
によって文書化されるようになる*「現在のMFCリリースでこのバグを修正する方法を誰かが知っていることがありますか?」* - これは、 "Right right solution is ... "*。バグが見つかった場合は、そのバグを修正したい場合は、製品のベンダー([Microsoft Connect](https://connect.microsoft.com/VisualStudio))に問い合わせる必要があります。 – IInspectable