VC_FormView
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()
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); }
Link: Programming(5321d)
Last-modified: 2007-10-07 (日) 15:55:24 (6382d)