CSingleDocTemplateクラスを使い、
CScrollViewを継承したViewクラスを作成し、画面に表示させています。
メインフレーム内でファイルを開くで、
viewクラスから別のCScrollView継承したクラス(nextViewとしましょう)を表示させるに
は、どのようにすればよろしいでしょうか。
本来ならば親クラスであるアプリケーションクラスに記述すればよいのですが、
viewクラス内でファイルを開く条件を記述済みですので、あまり変更したくはありませ
ん。
だからといって、Viewクラス内でnextViewをインスタンス化して渡すのもあまりよい策
だとはいえません。
よろしければご教授おねがいします。
☆開発環境
VisualC++.net 2003
Windows XP pro
一般的な設計では、ファイルを開くのファイルはCDocument(を継承したクラス)で
す。
ドキュメントによって表示するCViewを変えることはできるので、
ファイルを読み込んだタイミングで動的にCViewを変更するのが良いと思います。
以下はInside Visual C++のサンプルソースの一部です。
色々試してみてください。
void CMainFrame::SwitchToView(eView nView)
{
	CView* pOldActiveView = GetActiveView();
	CView* pNewActiveView = (CView*) GetDlgItem(nView);
	if (pNewActiveView == NULL) {
		switch (nView) {
		case STRING:
			pNewActiveView = (CView*) new CStringView;
			break;
		case HEX:
			pNewActiveView = (CView*) new CHexView;
			break;
		}
		CCreateContext context;
		context.m_pCurrentDoc = pOldActiveView->GetDocument();
		pNewActiveView->Create(NULL, NULL, WS_BORDER,
			CFrameWnd::rectDefault, this, nView, &context);
		pNewActiveView->OnInitialUpdate();
	}
	SetActiveView(pNewActiveView);
	pNewActiveView->ShowWindow(SW_SHOW);
	pOldActiveView->ShowWindow(SW_HIDE);
	pOldActiveView->SetDlgCtrlID(
		pOldActiveView->GetRuntimeClass() == 
		RUNTIME_CLASS(CStringView) ? STRING : HEX);
	pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
	RecalcLayout();
}
たいちうさん>
ご教授ありがとうございます。
おかげさまで、CViewを変更することに成功しました。
一つ問題があります。
変更したCViewクラスでは
コマンドハンドラは取得できるのに
なぜかメッセージハンドラが取得できないという問題がでてしまいました。
どこが問題なのかわからずにいます。
どなたかわかる方、よろしくお願いします。
追記:
Onpaint も動きません。
どうやら、ウインドウズメッセージが取得できていないようです。
試行錯誤の末、やっと解決いたしました。
たいちうさん、本当にありがとうございました!

 
  
  
  
  