重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

c言語win32apiで孫ウインドウからメッセージ処理ができません。
親ウインドウを作りその中に子ウインドウを作りさらに孫ウインドウを作りました。
以下のような感じです。
--
親ウインドウ(A)親はNULL

子ウインドウ(B)親はA

孫ウインドウ(C、プッシュボタン)親はB

で、孫ボタンをクリックしたらwindprocにWM_COMMANDメッセージが飛ぶと思っていたんですが
まったく反応しません。
試しに親をAに変更したらちゃんと動きました。
孫ウインドウからwindprocにメッセージを飛ばすにはどうしたらいいんでしょうか。
それとも何か特別な方法があるんでしょうか。
開発環境はVC++ExpressEdition2008を使っています。

A 回答 (3件)

>1の方法ですがそんな事が出来るんですか!?


>具体的な手法かもしくは参考ページとかあったら教えていただけないでしょうかm(_)m

実際のやり方としては2とそんなに違いはないかと思います。
子ウィンドウが具体的には何かが記述されていないので一般的な回答になりますが・・・

1.元の子ウィンドウのwndprocをGetWindowLongで取得する。
2.新しいwndprocを子ウィンドウに対してSetWindowLongで設定する。
3.新しいwndprocでは孫ウィンドウのWM_COMMANDメッセージを処理する。それ以外はCallWindowProcで元のwndprocを呼び出して処理させる。

これでサブクラス化するはずです。
1.の処理は2.のSetWindowLongの戻り値を利用することもできます。

1の方法は、孫ウィンドウのWM_COMMANDメッセージを受け取ったら、親ウィンドウに対してSendMessageでメッセージを送信する・・・という意味です。こちらも結局サブクラス化してますね・・・

2の方法は、何らかの方法で親ウィンドウハンドルを孫ウィンドウでアクセスできるようにしておく必要があります。

この回答への補足

アドバイスありがとうございますm(_)m
すごく役立ちました。
教えていただいた通りサブクラス化したらちゃんとメッセージ処理できました。
メッセージの飛ぶ仕組みが理解できました。

ほんとにありがとうございます。

補足日時:2010/06/04 01:04
    • good
    • 0

孫ウィンドウから見て、子ウィンドウの上に親ウィンドウがあるかどうかはわかりませんから、孫ウィンドウが直接親ウィンドウにWM_COMMANDメッセージを送信することはできないでしょう。



解決方法としては・・・

1.子ウィンドウのwindprocに孫ウィンドウから送信されたWM_COMMANDメッセージを親ウィンドウに送信する(中継)。
2.孫ウィンドウをサブクラス化して孫ウィンドウのwindprocを置き換え、直接WM_COMMANDメッセージを親ウィンドウに送信する。

あたりですかね・・・

この回答への補足

親の配下なんだから当然メッセージも飛ぶものだと思ってました。

1の方法ですがそんな事が出来るんですか!?
具体的な手法かもしくは参考ページとかあったら教えていただけないでしょうかm(_)m

2の方法を試してみたんですがコンパイルはできるもののウンともスンとも言いませんでした。
こっちはもう少し勉強してみます。

補足日時:2010/06/01 22:31
    • good
    • 0

普通は、親ウィンドウを検索してそこにイベント通知します。



http://www.geocities.jp/ky_webid/win32c/062.html
http://www.nitoyon.com/vc/reference/gui/static.htm

参考に。

この回答への補足

回答ありがとうございます。
参考ページ見させていただきました。
親ウインドウの検索ってところがいまいちわからないのですが
CreateWindowの第8引数(hParent)にGetParent関数を使うってことでしょうか?
試してみたんですがCのボタンはAの子供になってしまいました。
具体的にどんな感じか教えてもらえないでしょうかm(_)m

補足日時:2010/06/01 22:14
    • good
    • 0

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