プロが教えるわが家の防犯対策術!

MFCで現在 View-Documentの存在を知った程度の知識でプログラムを書いています。

MDI?形式でドキュメントにstrというCString型のメンバ変数を持たせています。
ViewからはGetDocumentで簡単にアクセスできますが、自作したダイアログボックス(例えばAbortのようなもの)の中にエディトボックスがあり、ここに入力された内容をドキュメントのメンバ変数strに代入したいのですが、どうすればよいのか分からず困っています。

あと、SDIやダイアログ形式でも同じように自作したダイアログのエディトボックスに入力した内容を設定したいです。

VBのInputBoxのようなことをしようとしていると想像してください。

A 回答 (4件)

#1です


>GetActiveDocument()でドキュメントを取得し、
>データをセットすることができましたが、
>Viewの画面では反映されず一度、
>最小化し元のサイズや最大化すると、セットした内容の結果になりました。

>DDX/DDVでいうところのUpdateDataのようなものは
>ドキュメントであるのでしょうか?

CDocument::UpdateAllViews()を呼び出してください。

http://msdn.microsoft.com/ja-jp/library/eys41xfw …
    • good
    • 0

#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です
    • good
    • 0

>例えばAbortのようなもの


ということはモーダルダイアログでしょうか。

だとしたら、モーダルダイアログから返ってきた時点で、Documentに代入すればいいのでは。
モーダルダイアログに入力した値の取得方法はヘルプに詳しく書いてあるはずです。
    • good
    • 0

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形式の場合
ターゲットとなるドキュメントがアクティブであることが前提とされています。

アクティブでないドキュメントにアクセスするには
さらに複雑な手順が必要です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/14 11:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!