
いつもお世話になっております。
現在、Visual Studio 2005にてMFCのダイアログベースのアプリケーションを作成しており、メッセージの送信の件で詰まった箇所があり質問させて頂きました。
現在のアプリケーションの全体像なのですが、
ダイアログベースなので、アプリケーション立ち上げ時に1つメインダイアログが表示されます。
そのメインダイアログ内にボタンを設置したとして、それぞれのボタン1,ボタン2からダイアログ1,ダイアログ2をDoModal()で表示させます。
それぞれのダイアログ1,2にはボタンが1つずつ設置されているとします。
質問させて頂きたいことは
メインダイアログへダイアログ1,2からメッセージ送信をする場合には
::SendMessage(GetParent()->GetSafeHwnd(),MYMSG,0);
でメッセージ送信をすることは出来ました。
しかしメインダイアログから呼び出されるダイアログ1,2間でメッセージを送信する場合に,例えばダイアログ1からダイアログ2へメッセージを送信させたいときに
void C****1Dlg::OnBnClicked(){
C****2Dlg m_dlg2;
::SendMessage(m_dlg2.GetSafeHwnd(),MYMSG,0);
とダイアログ1のボタンクリック時の関数内にコードを入力してもダイアログ2へメッセージは送信されず(ダイアログ2内のメッセージ受信関数OnMyMsg()が呼ばれず)、そのままスルーされるようなのです。
上述のコードで何か間違えている箇所があるでしょうか?
メッセージを扱うのは初めてで、とにかく相手先のウィンドウのハンドルを取得できればいいのかなと思ってコードを書いてみたのですが。。
ご存知の方がいらっしゃいましたら、ご意見宜しくお願い致します。
尚、開発環境は
Windows CE 6.0
Visual Studio 2005
です。
No.2ベストアンサー
- 回答日時:
ダイアログ1とダイアログ2は同時に表示されることがないようにとれ、
何がしたいのか?メッセージで処理するのは無理な気はしますが
void C****1Dlg::OnBnClicked(){
C****2Dlg m_dlg2; <-ローカル変数にm_つけるのは紛らわしい
<-ここにDoModal()がない=ウィンドウはない=ハンドルもない
(ここでダイアログ2を表示させたいわけではないとは思うけど)
::SendMessage(m_dlg2.GetSafeHwnd(),MYMSG,0); <-無理
ーーーーーーーー
メインダイアログのメンバーにダイアログ1,ダイアログ2のポインタを追加。
コンストラクタでNewする。他いくつか変更。
void C****1Dlg::OnBnClicked(){
C***MainDlg* pDlg0 = (C***MainDlg*)GetParent(); <-ちょっと手抜き
ASSERT(pDlg0->m_dlg1 == this); <-おまけ
C****2Dlg* pDlg2 = pDlg0->m_dlg2; <-ダイアログ2のポインタ
if ( pDlg2 )
::SendMessage(pDlg2->GetSafeHwnd(),MYMSG,0);
ーーーーーーーー
メッセージ送信しなくてもpublicかfriend利用で
if ( pDlg2 )
pDlg->OnMyMsg();
のほうが好きだけど。
ご回答ありがとうございます。
開いていないウィンドウのハンドルを取得することは無理なのですか。。それすら知りませんでした。
確かに、メッセージを送るよりも直接OnMyMsgの関数を読んでしまったほうが手っ取り早いですね、盲点でした。
ご意見ありがとうございました。
No.3
- 回答日時:
VisualStudioの環境がよくわからない(なにせこちらはC++Builder派)ので、大きいことはいえませんが、modalで
表示中のダイアログ1から開いていないmodalで動作するダイアログ2にメッセージを送ると言う部分を、発想的に変換して、ダイアログ1からメインウインドウへメッセージを送り、そのメッセージを受け取ったメインウインドウからダイアログ2へダイアログ1から受け取ったメッセージを送るではだめなのですか?ご回答ありがとうございます。
前の方にも教えて頂いたとおり、開いてないダイアログのハンドルをとることは出来ないのを知らず考えていました。
そのことを踏まえて、1108435様のおっしゃるように、一度メインダイアログにメッセージを送った後で、ダイアログ2へメッセージを送り処理をさせるように致しました。
ご意見ありがとうございました。
No.1
- 回答日時:
こんにちは。
C****2Dlgのポインタをつまみ出さないといけないのではないでしょうか。
void C****1Dlg::OnBnClicked(){
C****2Dlg* pDlg2 = //どうにかして取ってくる;
::SendMessage(pDlg2->GetSafeHwnd(), MYMSG, 0);
ご回答ありがとうございます。
ご指摘の通り、
C***2Dlgのポインタを取得するように以下のようにコードを変更してみました
void C*****1Dlg::OnBnClicked()
{
C*****2Dlg* pDlg2 = new C******2Dlg;
::SendMessage(pDlg2->GetSafeHwnd(),MYMSG,0);
}
しかし、Dlg2にメッセージは届かず、エラーが発生するということもなくメッセージ送信がスルーされたようになりました。。
試しにC***Dlg2にWindowProcを呼び出して、メッセージが来ていないか
確認してみたのですが、こちらにもMYMSGがきた様子はありませんでした。
コンストラクタを読んで、ポインタを得るというのは間違っているのでしょうか?
重ねての質問ですが、宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- C言語・C++・C# Seleniumで「ファイルを開く」ダイアログボックスのフォルダ指定する方法を教えてください。 1 2022/05/09 07:38
- その他(Microsoft Office) Office(Windows版,Word/Excel/PowerPoint等)にログインできません 4 2022/07/24 15:18
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Windows 10 MSアカウントの「個人設定をクラウドから削除します」は機能していないのでしょうか? 1 2022/11/20 17:01
- その他(メールソフト・メールサービス) サンダーバードでメールが受信されない 10 2022/03/24 17:00
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Excel(エクセル) マクロでボタンにつける名前がどこに設定されているかわからないケースがありました。 1 2023/06/19 19:37
- LINE LINEのスマホ機種変更時の移行失敗の復旧 1 2022/06/20 14:52
- 格安スマホ・SIMフリースマホ UQモバイルで、LINEが機能しないのはなぜ? 2 2022/08/19 11:19
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォーム上のリストボックスに...
-
メッセージボックスを大きくす...
-
リソースファイルとは・・・
-
MFCのexeのプログラムを MFCのd...
-
メッセージボックスのボタン文...
-
コンボボックスのドロップダウ...
-
MFCダイアログボックスを最前面...
-
MFC ポップアップメニューのチ...
-
confirmダイアログの表示文字に...
-
'int' から 'LPCSTR' に変換で...
-
ダイアログに表示されるアイコ...
-
ボタンの表示の色、フォントを...
-
ダイアログの一部を半透明化す...
-
vbscriptで、ファイル選択ダイ...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
-
ラジオボタンの初期指定
-
コンボボックス内の文字サイズ変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ボタンの表示の色、フォントを...
-
C# ボタンコントロール内で文字...
-
メッセージボックスを大きくす...
-
フォーム上のリストボックスに...
-
リソースファイルとは・・・
-
ダイアログの上のテキストボッ...
-
MFCダイアログボックスを最前面...
-
メッセージボックスのボタン文...
-
コンボボックスのドロップダウ...
-
ボタンの配置を変更したい
-
ダイアログボックスで指定した...
-
'int' から 'LPCSTR' に変換で...
-
ダイアログのボタンが押された...
-
ダイアログ最前面表示時の後ろ...
-
ダイアログの表示位置の保存
-
confirmダイアログの表示文字に...
-
ダイアログ間のメッセージの送...
-
エディットコントロールの色の...
-
MFC ポップアップメニューのチ...
-
vbscriptで、ファイル選択ダイ...
おすすめ情報