ダイアログAのOnButton1()の処理をダイアログBから実行するには?


でみ  2007-02-14 20:08:56  No: 64434

VC++6.0を使用しています。
テキストボックス等の処理は自分で作った関数の内部で処理できないと思うのですが、

ダイアログAのOnButton1()の処理をダイアログBのソースファイルから実行することは可能でしょうか?


Blue  2007-02-14 22:39:57  No: 64435

とりあえず、ダイアログAとダイアログBの関係はどうなっているのでしょうか?
親子関係であり、DoModalでダイアログAからダイアログBを呼び出している場合、
このつくりはあまり好ましいものではありません。
(子の分際で親を操作しようとしている)


でみ  2007-02-14 22:53:58  No: 64436

最初に起動するのは、ダイアログAです。
正確に言うとダイアログA(A.cpp)からB.cpp(ダイアログは存在しない)
のなかの関数Cを呼び出し関数Cは
 [lDisplay[i].open(null,0,0,x,y,1,1);]
の処理で画像用のフォームを表示します。
そこから、ダイアログAのOnButton1();の処理を実行したいと考えています。

簡単に言うとA.cpp以外の場所からダイアログAのOnButton1();の処理がしたいのです。


Blue  2007-02-14 23:07:04  No: 64437

ダイアログAのウィンドウハンドル(もしくはCWnd*型の値)を渡して
SendMessageするのが普通かなぁと。


でみ  2007-02-15 00:53:42  No: 64438

すみません。初心者なのでSendMessageを調べているのですが、
設定の仕方がよくわかりません。
どこら辺を勉強していけばよいのでしょうか?


Blue  2007-02-15 06:53:18  No: 64439

とりあえず、ボタンを押したいのであれば

WM_COMMAND

を調べてください。MSDNにも載っています。(英語版は確認できた)
あとは、任意のボタンを特定するために、ボタンのIDが#defineされている
resource.hをB.cppで#includeすれば使えるはずです。


でみ  2007-02-27 02:52:34  No: 64440

返事遅れてすみません。放置していたわけではなくて、
成功していなかっただけす。
できれば、全部のソースを記述してもらえたらありがたいです。
別の経路から以下の情報をもらいました。

======================================
ダイアログAのグローバルポインタを作って
CDlgA *gDlgA;
DialogInit内で、
gDlgA= this;
とすれば
gDlgA->OnButton1();
が呼べるようになります。
======================================
こちらのやり方でもコンパイルはうまくいくのですが
うまく呼んでくれていないようです。(※素通りする)

わかる方がいれば教えてください。
宜しくお願いします。


Blue  2007-02-27 05:20:07  No: 64441

子から親をよぶような処理は正直嫌いなので、
解説するのがめんどくさいから、類似スレを参考にしてください。
http://forums.belution.com/ja/cpp/000/065/43s.shtml


PATIO  2007-03-08 01:55:10  No: 64442

グローバルポインタを使う方法は簡単ですが、
モジュール間の結合が強くなるので通常はお勧めしません。
また、グローバル変数を使ったデータの引き渡しは、
管理が煩雑になるのでC++的にはあまりやりません。

子ウインドウに親のウインドウのポインタを渡しておいて
そのポインタを使ってPostMessageやSendMessageで制御した方が
モジュール間の結合が弱くなるので組み換え等が楽になります。
なぜかと言うとメッセージハンドラを直接呼ぶと言う事は、
相手がCDlgA等の特定のウインドウに限定されます。
しかし、CWnd*としておいてPostMessage等で制御をすれば、
相手がCWndから派生したクラスであれば、特定のウインドウで無いと
駄目と言う事にならないので流れを汲みかえる時に便利です。

私ならボタンを押した時の処理を別関数(ハンドラでない関数)に
しておいてその関数をOnButton1から呼ばせます。
そして子ウインドウは親ウインドウに対してユーザー定義メッセージを
ポストして親ウインドウはそのメッセージで受け取り、そのハンドラ内で
上記の別関数を呼ぶようにすると思います。
また、個人的にはハンドラを別の経路から直接は呼ばない方が良いと思います。
(ハンドラはメッセージのディスパッチャから呼ばれる前提で作られているはずだから)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加