CView派生クラスのm_pDocumentがNULL – プログラミング – Home

CView派生クラスのm_pDocum...
 
通知
すべてクリア

[解決済] CView派生クラスのm_pDocumentがNULL


あおい
 あおい
(@あおい)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

Windowsプログラムを始めて間もない初心者です。

MDIのメインフレームをCSplitterWndを用いて左右に分割します。
左側の領域には各種コントロールを貼り付けたCFormView派生クラスをあて、
右側の領域はAppウイザードで作成したCView派生クラスをあてて、MDIのクライ
アント領域にと考えています。
そこで、MainFrm.hに

CSplitterWnd m_wSplMain ;

MainFrm.cpp に
次のようにコードを追加しました。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if( ! m_wSplMain.CreateStatic( this, 1, 2 ) )
return FALSE ;

if( ! m_wSplMain.CreateView( 0, 0, RUNTIME_CLASS( CFormVi ),
CSize( 200, 80 ), pContext ) )
return FALSE ;
if( ! m_wSplMain.CreateView( 0, 1, RUNTIME_CLASS( CTSTView ),
CSize( 200, 80 ), pContext ) )
return FALSE ;

return CMDIFrameWnd::OnCreateClient(lpcs, pContext);
}

これで実行すると、リリースモードでは問題なく実行でき、画面の分割、各コントロ
ールの表示も正しく行われました。
ところがデバッグモードでビルド、実行するとASSERTではじかれしまいました。
場所は、TSTView.cpp の

CTSTDoc* CTSTView::GetDocument() const // デバッグ以外のバージョンはインライン
です。
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTSTDoc)));
return (CTSTDoc*)m_pDocument;
}

で m_pDocument == NULL のためだとわかりました。
ここはデバッグモードの時にしか通らないロジックらしく、リリースモードの時は
正常に動作します。(それもたまたまかもしれませんが)

そこで質問ですが、このm_pDocumentがNULLになってしまうのに、どんな原因が考えら
れるでしょうか?
なにぶん初心者なのもので、このレベルになるとどこを調べていいのかもよくわかり
ません。よろしくお願いします。

因みに、VC++.net2003, Windows2000で開発しています。


引用未解決
トピックタグ
愚暗
 愚暗
(@愚暗)
ゲスト
結合: 22年前
投稿: 6
 

MDI アプリケーションでは, CMainFrame の OnCreateClient は
引数 pContext が NULL で呼び出されるので、ビューはドキュメントに
関連付けられれず, m_pDocument は NULL になってしまいます。
ビューにドキュメントが関連付けられないので、今はよくても
先々ドキュメントを参照する処理を行うときに困ると思います。

実際に何を実現したいのかがよくわからないのですが、単に
ウィンドウ分割をサポートした MDI アプリケーションを作成したいなら,
CSplitterWnd メンバの追加や OnCreateClient のオーバーライドは
通常 CMainFrame ではなく CChildFrame の方で行います。

MDI ではなく SDI にしたいのなら... いろいろ直さなくてはならないので,
AppWizard で作り直した方が楽かもしれません。

左右に分割された MDI フレームウィンドウの右側に複数の MDI
子ウィンドウを作成したいなら、左側をダイアログバーにするのが
いいと思います。


返信引用
あおい
 あおい
(@あおい)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

愚暗さん、詳しく説明していただきありがとうございます。
m_pDocument に関しては仕様なのですね。
わかりました。

私の目的からすると、ご提案していただいたダイアログバーを使用する方法が
いいかもしれません。今後、その方向でやり直してみたいと思います。
どうも、ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました