前回、「他Dialog上のエディットボックスに文字列を送信・表示するには」で
解決にしてしまったのですが、Nakamuraさんの教えて頂いた方法を試そうとして
以下の点で躓いています。宜しかったら教えて下さい。
1.親フォームとして、ダイアログA(クラスはCADlg)があるとします。
2.Aから子フォームB(クラスはCBDlg)を呼び出しています。(モードレスです)
その際のコードは以下の通りです。
CBDlg *dlg = new CBDlg;
dlg->Create(IDD_DIALOG1,NULL); //IDD_DIALOG1は子フォームのID
dlg->SetActiveWindow();
//ここまでは正常に子フォームをモードレスで表示してます。
3.ユーザー定義MSGを WM_TEST としています。
#define WM_TEST (WM_USER + 1)
・
・
BEGIN_MESSAGE_MAP(CADlg,CDIALOG)
//[[AFX_MSG_MAP(CADlg)
ON_MESSAGE(WM_TEST,OnTest)
・
・
//]]AFX_MSG_MAP
END_MESSAGE_MAP()
4.そして、ここからが本題なのですが、子から親に対してSendMessageしてます。
CADlg *dlg = new CADlg;
dlg->SendMessage(WM_TEST); //ここでエラー
として実行すると、エラーになります。
エラーは、dlgが 0x0000である為となってます。
因みに親にメンバ変数を作成し、そのメンバにアクセスしようと、以下の2種類の
方法を使いましたが、いずれも前述同様 dlg が0x0000となってしまいエラーになります。
前提:
m_EDT1 //EditBoxをコントロールとして
以下のコードは子の部分です。
その1:
CADlg *dlg =new CADlg;
dlg->m_EDT1~ ; //ここでエラー
その2:
CADlg dlg;
dlg.m_EDT1~ ; //ここでエラー
補足:別の利用方法として以下の用にしても駄目です。
CADlg *dlg=new CADlg;
dlg->SetActiveWindow(); //ここでエラー
//或いは、
CADlg dlg;
dlg.SetActiveWindow(); //ここでエラー
因みにFindWindowを使ってやると出来るのですが、恐らく
そんな事をしなくても上記の様な方法で完結できると
思うのですが、初心者なものでどうしてもわかりません。
既に表示されている兄弟ウィンドウを操作したり、そのメンバを操作する方法
をどうか教えて下さい。
親ダイアログって既に存在してるんですよね???
その場合、new しちゃうと別のオブジェクトが生成されちゃうと思うんですが・・・
子ダイアログを生成するとき親ハンドル渡してます?それともNULLでやってるのかな?
いずれにしても子ダイアログを生成したときにメンバ変数なりなんなりで親ダイアログの
ポインタかハンドルを渡しちゃうのが確実だと思います。
あとAfxGetMainWindow()とかで出来るかもです。(´▽`;)
まころんさん、レス遅れて済みません…
子ダイアログを生成する時は、Create(IDD_DIALOG1,NULL) //又はthis としています。
初歩的な事を聞いて済みませんが、どの関数を使って子ダイアログ生成時に親ダイアログの
ポインタ乃至ハンドルを渡せば良いのでしょうか?また、生成時に渡さない場合、
どの様に取得するのでしょうか?(親以外を操作する時にはこの方法になるかと…)
私が書いた原文では、ポインタもハンドルも取得できませんでした。
因みにAfxGetMainWnd()は、参考書などを読みましたがいまいち何を目的に使用する
関数なのかつかめないんです。(説明の言い回しが色々な意味にとれちゃう)
メインとは常に親の事を言うのですか?
似たような関数もある様ですが、ヘルプを読んでもピンと来ないんです。(情けない…)
お手数なのは承知なんですが、これを期に憶えたいので教えて頂けると幸いです。
AfxGetMainWnd()で親フォームのハンドルが取得できる事を
テストプロジェクトで確認しました。
そうなると、後は兄弟ウィンドウのハンドルをどの様に取得すれば良いのでしょう。
兄弟ウィンドウ(正確ではないですが)、はそれぞれ呼び出し元ウィンドウが
別であるとしてます。こればっかりはFindWindowしかないのでしょうか?
他の質問の項で、この件は取り敢えず解決しましたので
本件は、済みとさせて頂きます。