非常にややこしい,かつ,クラスウィザードによるイベントハンドラの追加やオーバーライドに対応していないため手入力しなくてはならない.
しかしながら,複雑なコーディングをすることなく,タブ化・並べて表示・フローティングウィンドウで表示を動的にできるためその点では有用である.
直接移行するよりも新しいスケルトンに既存のクラスを移すほうがかなり簡単だと思われる.
他CMFCMenuやCMFCToolbarが適切に設定されていれば,メニュー上右クリックで表示されるCMFCPopupMenuで表示非表示の設定も有効になるはずである.
しかしながら,複雑なコーディングをすることなく,タブ化・並べて表示・フローティングウィンドウで表示を動的にできるためその点では有用である.
直接移行するよりも新しいスケルトンに既存のクラスを移すほうがかなり簡単だと思われる.
- MFCアプリケーションを新規作成する.
- Doc-Viewアーキテクチャのサポートを外す(どうしても使いたければ止めないがどうせPaneはViewではないためUpdateAllViewsの通知対象外である)
- Classic Menuは不可.Use a menu bar and toolbar か Use a ribbonを選択する
- その他設定は必要に応じて行う.
- CDialog派生クラスをCPaneDialog派生クラスに変更する.
- コンストラクタの引数を消す.
- OnInitDialogをHandleInitDialog(WPARAM wparam, LPARAM lparam)に変更する.
- メッセージマップにON_MESSAGE(WM_INITDIALOG, HandleInitDialog)を追加する.
- ダイアログクラス自体のIDを設定する.ID_VIEW_HOGEVIEW.
- CMainFrameにON_COMMAND(ID_VIEW_HOGEVIEW, OnViewHogeView)というイベントハンドラを作る.
- OnCreateでダイアログを作成する(下記参照).
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_COMMAND(ID_VIEW_HOGEVIEW, OnViewHogeView) ON_COMMAND(ID_VIEW_FUGAVIEW, OnViewFugaView) END_MESSAGE_MAP() int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { //省略 //CMainFrame::CHogeView m_wndHogeView; //derived from CDockablePane //CMainFrame::CFugaDialog m_wndFugaDlg; //derived from CPaneDialog m_wndHogeView.Create(_T("Hoge"), this, CRect(0, 0, 100, 100), TRUE, ID_VIEW_HOGEVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_BOTTOM | CBRS_FLOAT_MULTI); m_wndFugaDlg.Create(_T("Fuga"), this, TRUE, CFugaDialog::IDD, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT| CBRS_FLOAT_MULTI, ID_VIEW_FUGAVIEW); m_wndHogeView.EnableDocking(CBRS_ALIGN_ANY); m_wndFugaDlg.EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndHogeView); DockPane(&m_wndFugaDlg); } void CMainFrame::OnViewHogeView() { ShowPane (&m_wndHogeView, !(m_wndHogeView.IsVisible ()), FALSE, TRUE); RecalcLayout (); } void CMainFrame::OnViewFugaView() { ShowPane (&m_wndFugaDlg, !(m_wndFugaDlg.IsVisible ()), FALSE, TRUE); RecalcLayout (); }
他CMFCMenuやCMFCToolbarが適切に設定されていれば,メニュー上右クリックで表示されるCMFCPopupMenuで表示非表示の設定も有効になるはずである.
コメントをかく