VC_FormView - RとLinuxと...

RとLinuxと...


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(3184d)
Last-modified: 2007-10-07 (日) 15:55:24 (4245d)