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

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

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

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

A 回答 (4件)

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

#1です


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

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

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

http://msdn.microsoft.com/ja-jp/library/eys41xfw(vs.80).aspx
    • 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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q大衆文学はエドガー・アラン・ポーが作ったのか

大衆文学は、エドガー・アラン・ポーが作ったのでしょうか。

Aベストアンサー

エドガー・アラン・ポーといえば、どちらかというと、探偵小説の元祖として知られているのではないでしょうか。

大衆の好みの合わせて書かれたフィクションの読み物、という程度の意味での「大衆文学」でしたら、ポーをはるかに遡って、紀元2世紀末ごろに書かれたといわれる『ダフニスとクロエ』があります。岩波文庫とかに入っています。お読みになると、「これぞ大衆文学!」と感じると思いますよ。

Qダイアログからビュークラスのメンバ変数へ代入するには?

プログラミング初心者です.
Visual C++.netを使っています.

Viewクラスから,Domodal()にてあるダイアログを呼び出しました.
ダイアログ上のあるボタンを押したら,Viewクラスのメンバ変数へ1を代入するという処理をしたいと考えています.
 ラジオボタンやエディタコントロールであれば,DDXを利用すればよいと思うのですが,単なるボタンの場合はどうすれば,呼び出し元のViewクラスの値を操作(この場合,代入)出来るのでしょうか?

Aベストアンサー

ダイアログのコンストラクタに変数を増やすなどして、Viewクラスのポインタをダイアログに登録します。

ダイアログのボタンクリックハンドラで既に登録されているViewクラスのポインタを使用して希望の変数を変更するとできます。

これは色々な方法があります。

逆にダイアログクラスにボタンのクリック結果を変数として残しておき、ダイアログが終了してからダイアログのクリック結果をViewクラスが確認する方法もあります。

他には、ダイアログのボタンクリックハンドラから、Viewクラスへメッセージを送信するという方法もありますね。

色々有るので色々勉強してくださいね。

Qエドガー・アラン・ポーのどの小説が原作?

原題:Operene stiny
製作:1930年 チェコスロバキア
監督:レオ・マーティン
出演:イジー・フロン、他

原題:L'Etrange Fiancee
製作:1930年 仏
監督:George Pallu
出演:アンリ・ボーダン、他

上記映画2作品は、エドガー・アラン・ポーの同一の小説を原作にして製作されたと言う事なのですが、どの小説が原作なのかが分かりません。
どなたかご存知の方、お教え下さい。
できれば情報源も…。

Aベストアンサー

今晩は
参考URLによるとどちらも短編小説「SYSTEM OF DOCTOR TARR AND PROFESSOR FEATHER(タール博士とフェザー教授の療法)」が原作のようですね。↓

http://www.citwf.com/film255153.htm

http://www.citwf.com/film106205.htm

ご参考まで。

http://homepage3.nifty.com/wooddoor/bookshelf/poe.htm

http://www.papy.co.jp/act/books/1-103836/

参考URL:http://www.citwf.com/person32264.htm

Qメンバ変数が変更されそうなconstメンバ関数

c++のconstメンバ関数についての質問です。
以下のコードの様に、constメンバ関数で
メンバ変数を変更しているように見える場合、
本来はどのように記述すべきか?

class foo
{
public:
foo(){}
foo(int i){ d = i; }
void hoge(foo *dest0, foo *dest1 ) const
{
dest0->d = d*2;
dest1->d = d*4;
}

int d;
};

int main()
{
foo f(1);
foo p,q;

f.hoge(&p,&q);

std::cout << f.d << "\n";
std::cout << p.d << "\n";
std::cout << q.d << "\n";


f.hoge(&f,&q);
std::cout << f.d << "\n";
std::cout << q.d << "\n";


return 0;
}

ちなみに出力期待値は
1
2
4
2
4
とします。
上のコードは
1
2
3
2
8
と出力されますが、このようなことが無いように実装するには
どうすべきかという質問です。
dest0->d = d*2;
dest1->d = d*4;
の所を
int i=d;
dest0->d = i*2;
dest1->d = i*4;
とすべき?
それともhogeの最初に
if( (this == dest0) || (this == dest1) || (dest0== dest1) ){
throw "同じオブジェクトじゃだめ";
}
とすべき?
どんな書き方が安定でしょうか?

c++のconstメンバ関数についての質問です。
以下のコードの様に、constメンバ関数で
メンバ変数を変更しているように見える場合、
本来はどのように記述すべきか?

class foo
{
public:
foo(){}
foo(int i){ d = i; }
void hoge(foo *dest0, foo *dest1 ) const
{
dest0->d = d*2;
dest1->d = d*4;
}

int d;
};

int main()
{
foo f(1);
foo p,q;

f.hoge(&p,&q);

std::cout << f.d << "\n";
std::cout << p.d << "\n";
std::cout << q.d << "\n";


f.hoge(&f,&q);
std::cout...続きを読む

Aベストアンサー

「意味からいって同じオブジェクトを指定できるかどうか」がまず問題で, 「同じオブジェクトを指定する意味がある」なら前者, 「無意味である」あるいは「してはならない」なら後者の形になるんでは?
もっとも, このようなメンバー関数を作らなければならないとしたら「設計が間違っている」ような気もするんだけど....

Qエドガー・アラン・ポーの作品を探しています。

昔、アニメ「まんが世界昔ばなし」で『炎のうま』と言う作品を見たのですが、最近になって思いだし調べてみたところ、原作が推理小説で有名なエドガー・アラン・ポーだと言う事を知りました。
子どもが見るにはかなり残酷と言うか、落ちの無い話だったのでかなり印象に残っています。
ポーが書いた原作を読んでみたいと思ったのですが、この作品は日本でも翻訳出版されているのでしょうか?
『世にも怪奇な物語』と言う映画で『黒馬の哭く館』と言う題名でも映像化されていたようなので、もしかしたら原題が違うのかもしれません。
一度原作を読んでみたいのですが可能でしょうか?
もし出版されているのなら、収録されている書籍のタイトルや出版社など教えてください。
御存じの方、どうぞ宜しくお願い致します。

Aベストアンサー

以下によれば、「メッツェンガーシュタイン」が原作だそうです。
http://yuubaenoumi.de-blog.jp/honokibun/2006/12/post_30a0.html
http://blogs.yahoo.co.jp/mikanjyuice/6002960.html

創元推理文庫522-1「ポオ小説全集1」に収録されているそうです。
http://www.aga-search.com/110-1-1poe.html
http://book.akahoshitakuya.com/b/4488522017

蛇足:「世にも怪奇な物語」の解説
http://momorex.blog.fc2.com/blog-entry-69.html
http://sknys.blog.so-net.ne.jp/archive/20090511
http://d.hatena.ne.jp/kuroda920/20111110/1320933737

Qif(str=='a' || str=='b' || str=='c')これまとめられませんか?

題名どおりなんですが短縮してかけませんか?

Aベストアンサー

Perlなどではこういうのは正規表現で
if ( str =~ /(a|b|c)/ )

なんていうように書けます.
C言語でも正規表現を使うためのライブラリはある
(正規表現,C言語などのキーワードで検索して探してください)
ので,それを探して使うのもありかもしれません.

Qエドガー・アラン・ポー ⇒ 江戸川乱歩

よろしくお願いします。

海外の有名な固有名詞(人名以外も可)をもじった日本の有名人のペンネーム、芸名(グループ名も可)を挙げてください。
文学カテで質問していますが、文学界の人物でなくてもOKです。

今のところ、ここまで集めました。
・エドガー・アラン・ポー ⇒ 江戸川乱歩
・ダニー・ケイ ⇒ 谷啓
・バスター・キートン ⇒ 益田喜頓
・ザ・ビートルズ ⇒ ずうとるび
・クインシー・ジョーンズ ⇒ 久石譲
・グレタ・ガルボ ⇒ 呉田軽穂(松任谷由実)
・ダンセイニ卿 ⇒ 団精二(荒俣宏)
・イーデス・ハンソン ⇒ 半村良
・モーリス・シュバリエ ⇒ 芝利英
・イヴ・モンタン ⇒ 夷撫悶汰(桑田佳祐)
・ビビアン・リー ⇒ 微美杏里(藤真利子)
・メグ・ライアン ⇒ Meg.C(松田聖子)
・周星馳 ⇒ 馳星周
・アーサー・C・クラーク ⇒ 浅倉久志
・アーサー・マッケン ⇒ 朝松健
・エラリー・クイーン(イニシャルがE.Q.) ⇒ 依井貴裕(音読みすると、いいきゆう)
・バーナード・ショー ⇒ 花登筐

Aベストアンサー

マルキ・ド・サド⇒丸木砂土(秦豊吉)
http://ja.wikipedia.org/wiki/%E7%A7%A6%E8%B1%8A%E5%90%89

ボブ・ディラン⇒ホフディラン
http://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%95%E3%83%87%E3%82%A3%E3%83%A9%E3%83%B3

アルチュール・ランボー⇒みなみらんぼう
http://ja.wikipedia.org/wiki/%E3%81%BF%E3%81%AA%E3%81%BF%E3%82%89%E3%82%93%E3%81%BC%E3%81%86

確定できないところで
シャルル・デュラン⇒久生十蘭
http://ja.wikipedia.org/wiki/%E4%B9%85%E7%94%9F%E5%8D%81%E8%98%AD

ミッキー・マウス⇒三木鶏郎
http://www.mikitoriro.jp/html/KEY%20WORD/KEY%20WORD.html

あと、小田島雄志が学生時代にチェーホフをもじって「池永保夫」と名乗ったことがあるそうですが一体何のアルバイトをしていたのか(翻訳???)・・・。
http://ja.wikipedia.org/wiki/%E5%B0%8F%E7%94%B0%E5%B3%B6%E9%9B%84%E5%BF%97

マルキ・ド・サド⇒丸木砂土(秦豊吉)
http://ja.wikipedia.org/wiki/%E7%A7%A6%E8%B1%8A%E5%90%89

ボブ・ディラン⇒ホフディラン
http://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%95%E3%83%87%E3%82%A3%E3%83%A9%E3%83%B3

アルチュール・ランボー⇒みなみらんぼう
http://ja.wikipedia.org/wiki/%E3%81%BF%E3%81%AA%E3%81%BF%E3%82%89%E3%82%93%E3%81%BC%E3%81%86

確定できないところで
シャルル・デュラン⇒久生十蘭
http://ja.wikipedia.org/wiki/%E4%B9%85%E7%94%9F%E5%8D%81%E8%98%AD

ミッキー・マウス⇒三木...続きを読む

QMDIでのダイアログ生成

VC++2005でMDIアプリケーションを作成しています。

ダイアログベースでは、DoModal()にてダイアログを生成していましたが、
MDIでのダイアログ生成の方法が分かりません。。

調べた結果、
(1)CreateWindow()にてクライアントウィンドウを作成
(2)CreateMDIWindow()にて子ウィンドウを作成
の順序で処理を行うことは分かりましたが、
関数の一部の引数に何を設定してやれば良いのかが不明です。。
※下記はネット上にあったサンプルソースです。
 「???」の箇所が不明な引数です。

(1)
CreateWindow(
  TEXT("MDICLIENT"), //MDICLIENT は固定です
  NULL,
  WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
  0, 0, 0, 0,
  hWnd,       //メインウィンドウのハンドル←???
  (HMENU)1,    //←???
  hInst,       //インスタンスハンドル←???
  (LPSTR)&ccs    //CLIENTCREATESTRUCT構造体のポインタ←???
 );

(2)
HWND CreateMDIWindow(
 MDI_CHILD ,   //ウィンドウクラス名
 TITLE ,     //ウィンドウのタイトルバーテキスト
 0 ,       //ウィンドウスタイル。WS_MAXIMIZE(最大化表示)など
 CW_USEDEFAULT , //X座標
 CW_USEDEFAULT , //Y座標
 CW_USEDEFAULT , //幅
 CW_USEDEFAULT , //高さ
 hClientWindow , //クライアントウィンドウのハンドル ←???
 hIns ,      //インスタンスハンドル       ←???
 0        //アプリケーション定義の値
);

なお、行いたい処理の流れとしては、
CTestDialogクラスより、CTest2Dialogクラスのダイアログを、
呼び出したいのです。
うまく説明できず申し訳ありませんが、
お詳しい方おられましたら、具体例など交えてご説明頂けると幸いです。
お手数ですが、どうか宜しくお願い致します。

VC++2005でMDIアプリケーションを作成しています。

ダイアログベースでは、DoModal()にてダイアログを生成していましたが、
MDIでのダイアログ生成の方法が分かりません。。

調べた結果、
(1)CreateWindow()にてクライアントウィンドウを作成
(2)CreateMDIWindow()にて子ウィンドウを作成
の順序で処理を行うことは分かりましたが、
関数の一部の引数に何を設定してやれば良いのかが不明です。。
※下記はネット上にあったサンプルソースです。
 「???」の箇所が不明な引数です。

(1)
CreateW...続きを読む

Aベストアンサー

追記と訂正。

フレームウインドウの中のクライアント領域に「クライアントウィンドウ」を作成し、そのクライアントウィンドウの中に、子MDIウィンドウを作成する必要があります。

先ほどの回答では「クライアントウィンドウの作成」を失念していました。

フレームウインドウ(WinMainで作る)
 クライアントウィンドウ(プロシジャコールバックのWM_CREATEで作る)
  最初に作られる子MDIウィンドウ1
  WM_MDICREATEなどで後から作られる子MDIウィンドウ2
  WM_MDICREATEなどで後から作られる子MDIウィンドウ3
という関係になります。

http://wisdom.sakura.ne.jp/system/winapi/win32/win139.html
を参考にすると良いでしょう。

なお、クライアントウインドウを作る時の「(HMENU)1」の「1」は、フレームウィンドウ内に作るウィンドウのID番号で、
LRESULT CALLBACK FrameProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
(中略)
  switch (msg) {
(中略)
  case WM_COMMAND:
   if (LOWORD(wp) == 1) { //CreateWindowのhMenu引数の値。この「1」が「(HMENU)1」に対応する
    何かの処理
   }
(以下略)
って感じで使います。

なお、紹介したページにも書いてますが、ウインドウプロシージャのコールバック関数から呼ぶ「デフォルトプロシージャ」が普通と違うので注意して下さい。

また「クライアントウィンドウのクラス名」は、システムに登録済みの「TEXT("MDICLIENT")」でなければなりません。

同様に「子MDIウインドウのクラス名」も、システムに登録済みの「TEXT("MDICHILD")」でなければなりません。

これらは「ボタンのクラス名はTEXT("BUTTON")にしなければならない」のと同じです。

追記と訂正。

フレームウインドウの中のクライアント領域に「クライアントウィンドウ」を作成し、そのクライアントウィンドウの中に、子MDIウィンドウを作成する必要があります。

先ほどの回答では「クライアントウィンドウの作成」を失念していました。

フレームウインドウ(WinMainで作る)
 クライアントウィンドウ(プロシジャコールバックのWM_CREATEで作る)
  最初に作られる子MDIウィンドウ1
  WM_MDICREATEなどで後から作られる子MDIウィンドウ2
  WM_MDICREATEなどで後...続きを読む

Qエドガーアランポーの大鴉のモデル・・。

エドガーアランポーの作品の「大鴉」にでてくるレノアの言う女性にはモデルとなる人物がいるのでしょうか?いるのでしたらそれは誰なのでしょう?

Aベストアンサー

ポー (1809-1849) について詳しくはありません。検索してわかったことをまとめます。

ポーのいとこにして妻であったヴァージニア (1822-47) がモデルではないかといわれることがあります。

「大鴉」 (1845) が発表されたころヴァージニアは結核を患っていて2年後に亡くなるというのが、その理由です。ポーが友人に宛てた手紙 (1848) によれば、ヴァージニアは喀血するたびに何度も死の縁をさまよい、ポーはそのたびに半狂乱になったようです。

ただし、 「大鴉」 にみられるような若く美しい最愛の女性と死別した悲しみは、ほかの作品のなかにも出てきます。

A Paean (1831),Lenore (1841),Ulalume (1847),Annabel Lee (1849)
The Fall of the House of Usher (1839)

一連の作品の女性像がヴァージニアと重なる部分は大きいようです。しかし、ポーとの結婚 (1836)、最初の喀血 (1842) の時期を考えあわせると、ポーのなかにはじめからレノアのような美しい悲しみの観念が形成されていて、それが不思議なことにヴァージニアと重なったことによって、一層ポーを痛めつけたように思われます。

ポーが母 (1811)、養母 (1829)と早く死別したことが関連しているのではないかという記事もありました。


参考URL(質問の回答に直接関係するもののみご紹介します)

http://www.greenspun.com/bboard/q-and-a-fetch-msg.tcl?msg_id=00BYrx
http://www.cummingsstudyguides.net/Guides2/Raven.html
http://en.wikipedia.org/wiki/Virginia_Eliza_Clemm_Poe
http://www.eapoe.org/geninfo/poechron.htm 

ポー (1809-1849) について詳しくはありません。検索してわかったことをまとめます。

ポーのいとこにして妻であったヴァージニア (1822-47) がモデルではないかといわれることがあります。

「大鴉」 (1845) が発表されたころヴァージニアは結核を患っていて2年後に亡くなるというのが、その理由です。ポーが友人に宛てた手紙 (1848) によれば、ヴァージニアは喀血するたびに何度も死の縁をさまよい、ポーはそのたびに半狂乱になったようです。

ただし、 「大鴉」 にみられるような若く美しい最...続きを読む

QMFCでSDIからダイアログの呼び出し

現在MFCでプログラムを作っているのですが、

SDIベースで作成しており、
MENUバーからMENUを選択したときに
新規(リソースに作成済み)のダイアログを
表示したいのですが、どのようにしたら
よろしいのでしょうか?

ヒントだけでもお願いいたします。

DoModal()とか、newを使ったら、良いのではないかという
見当だけはつけてみたのですが。

よろしくお願いいたします。

Aベストアンサー

1.まず作成したダイアログに対応したクラスを作成します。
  これをCSampleDlgとします。
  (クラスウィザードを使えば楽でしょう)
2.メニューが選択されたとき、以下の処理を入れればモーダルで
  ダイアログが表示されます。
  {
    CSampleDlg dlg;
    dlg.DoModal();
  }


人気Q&Aランキング

おすすめ情報