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 も動きません。
どうやら、ウインドウズメッセージが取得できていないようです。
試行錯誤の末、やっと解決いたしました。
たいちうさん、本当にありがとうございました!