Programming_from_old_html0 の変更点 - アールメカブ

アールメカブ


Programming_from_old_html0 の変更点


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);
 }