• ベストアンサー

ダイアログから、ドキュメントのメンバ変数に設定するには

MFCで現在 View-Documentの存在を知った程度の知識でプログラムを書いています。 MDI?形式でドキュメントにstrというCString型のメンバ変数を持たせています。 ViewからはGetDocumentで簡単にアクセスできますが、自作したダイアログボックス(例えばAbortのようなもの)の中にエディトボックスがあり、ここに入力された内容をドキュメントのメンバ変数strに代入したいのですが、どうすればよいのか分からず困っています。 あと、SDIやダイアログ形式でも同じように自作したダイアログのエディトボックスに入力した内容を設定したいです。 VBのInputBoxのようなことをしようとしていると想像してください。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

SDIの場合の手順を示します 1) AfxGetMainWnd()でメインウィンドウのポインタを取得します。 2)メインウィンドウのポインタをキャストしてCFrameWndのポインタを   入手します。 3)CFrameWndのポインタを使ってCFrameWndクラスのGetActiveDocument() を呼び出します。戻り値をキャストし、ドキュメントのメンバ変数strに   代入します。 これでSDI形式の場合なら、ダイアログからでもアクセスできます。 MDI形式では、若干手順が異なります 1) AfxGetMainWnd()でメインウィンドウのポインタを取得します。 2)メインウィンドウのポインタをキャストしてCFrameWndのポインタを   入手します。 ここまでは同じなのですが 3)CFrameWndのポインタを使ってCFrameWndクラスのGetActiveFrame() を呼び出します。戻り値をキャストしてCMDIChildWndのポインタを得ます。 4)CMDIChildWndのGetActiveDocument() を呼び出します。   戻り値をキャストし、ドキュメントのメンバ変数strに   代入します。 以上の手順でよかったと思います。 (未確認です) なお、上記手順にはエラー処理が一切考慮されていません。 また、特にMDI形式の場合 ターゲットとなるドキュメントがアクティブであることが前提とされています。 アクティブでないドキュメントにアクセスするには さらに複雑な手順が必要です。

kourei
質問者

お礼

回答ありがとうございます。 GetActiveDocument()でドキュメントを取得し、データをセットすることができましたが、Viewの画面では反映されず一度、最小化し元のサイズや最大化すると、セットした内容の結果になりました。 ダイアログを閉じた?(値をセットした時点)で直にviewにも反映させたいのですが、DDX/DDVでいうところのUpdateDataのようなものはドキュメントであるのでしょうか?

その他の回答 (3)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.4

#1です >GetActiveDocument()でドキュメントを取得し、 >データをセットすることができましたが、 >Viewの画面では反映されず一度、 >最小化し元のサイズや最大化すると、セットした内容の結果になりました。 >DDX/DDVでいうところのUpdateDataのようなものは >ドキュメントであるのでしょうか? CDocument::UpdateAllViews()を呼び出してください。 http://msdn.microsoft.com/ja-jp/library/eys41xfw(vs.80).aspx

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

#1です >VBのInputBoxのようなことをしようとしていると想像してください。 これを見落としておりました。 >ViewからはGetDocumentで簡単にアクセスできますが、 >自作したダイアログボックス(例えばAbortのようなもの)の中に >エディトボックスがあり、 >ここに入力された内容を >ドキュメントのメンバ変数strに代入したいのですが、 >どうすればよいのか分からず困っています。 ダイアログボックスの中からドキュメントに設定するわけではなくて、 ダイアログボックスが消えてからドキュメントに設定するわけですね。 それなら,DDX/DDVを使えば簡単です まず、ダイアログ・クラスをCInputDialogとします。 (別になんでもいいわけですが...) ここにメンバ変数m_Textを追加します。 m_Textはコントロール変数のCString型、カテゴリはValueにします。 操作方法についてはこちらが詳しいです http://www.g-ishihara.com/mfc_dx_02.htm あとは、必要な個所で呼ぶだけです 呼び方は CInputDialog dlg; if (dlg.DoModal() ==IDOK) { GetDocument()->str = dlg.m_Text; } これでOKです

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

>例えばAbortのようなもの ということはモーダルダイアログでしょうか。 だとしたら、モーダルダイアログから返ってきた時点で、Documentに代入すればいいのでは。 モーダルダイアログに入力した値の取得方法はヘルプに詳しく書いてあるはずです。

関連するQ&A