Form View で ダイアログを入れ換える方法 まず そのプロジェクト名(F:\program\VC_2000\TowForm\TwoForm.h)のヘッダファイルに,任意のIDを設定 #define IDU_CHANGE_VIEW (WM_USER + 101) #define IDU_CHANGE_VIEW2 (WM_USER + 101) そのプロジェクトの(メイン)フレームクラスのヘッダ MainFrm.h に以下を記述。 protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg LRESULT OnChangeView(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnChangeView2(WPARAM wParam, LPARAM lParam); DECLARE_MESSAGE_MAP() そのプロジェクトの(メイン)フレームクラスのクラスファイル MainFrm.cpp に以下を BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_MESSAGE(IDU_CHANGE_VIEW,OnChangeView) ON_MESSAGE(IDU_CHANGE_VIEW2,OnChangeView2) END_MESSAGE_MAP() // CMainFrame メッセージ ハンドラ MainFrm.cpp に OnChangeView, OnChangeView2 を以下のように記述 OnChangeView2 の方では pNewViewClass = RUNTIME_CLASS(CTwoFormView); とオリジナルの View クラスを指定する。 LRESULT CMainFrame::OnChangeView(WPARAM wParam,LPARAM lParam){ CView * pOldActiveView = GetActiveView(); CRuntimeClass * pNewViewClass; pNewViewClass = RUNTIME_CLASS(CNew);新しいViewクラス名 // create the new view CCreateContext context; context.m_pNewViewClass = pNewViewClass; context.m_pCurrentDoc = GetActiveDocument(); CView * pNewView = STATIC_DOWNCAST(CView, CreateView(&context)); if (pNewView != NULL){ // the new view is there, but invisible and not active... pNewView->ShowWindow(SW_SHOW); pNewView->OnInitialUpdate(); SetActiveView(pNewView); RecalcLayout(); // finally destroy the old view... pOldActiveView->DestroyWindow(); } return 0L; } 新しいダイアログ IDD_FORMVIEW を FormView 型として作成し,新ダイアログ上でダブルクリックし, 新しいクラス CNew を,FormView を継承元として作成。 New.h に以下を追加 #include "TwoFormDoc.h" ... public: CTwoFormDoc * GetDocument() const; ... #ifndef _DEBUG inline CTwoFormDoc * CNew::GetDocument() const { return reinterpret_cast(m_pDocument); } #endif New.cpp に以下を追加 CTwoFormDoc * CNew::GetDocument() const { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTwoFormDoc))); return (CTwoFormDoc *)m_pDocument; } #endif //_DEBUG またオリジナルのViewクラスのヘッダファイル (TwoFormView.h) にも以下を追加 #include "TwoFormDoc.h" これにより,両方の ViewClass から以下のようにして Doc クラスを参照できる。 CTwoFormDoc * pDoc = (CTwoFormDoc *) GetDocument(); 変更メッセージの発信元 (例えばオリジナルの View クラスのボタンコントロールから) TwoFormView.cpp に以下を記述。 void CViewChangeView::OnBnClickedButton1() { // TODO : ここにコントロール通知ハンドラ コードを追加します。 CWnd *pwd = GetParentFrame(); pwd->SendMessage(IDU_CHANGE_VIEW,0L,0L); }