• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c言語win32apiで孫ウインドウからメッセージ処理ができません。)

c言語win32apiで孫ウインドウからメッセージ処理ができません

このQ&Aのポイント
  • c言語win32apiで孫ウインドウからメッセージ処理ができません。親ウインドウを作りその中に子ウインドウを作りさらに孫ウインドウを作りました。孫ウインドウからwindprocにメッセージを飛ばすにはどうしたらいいんでしょうか。
  • 開発環境はVC++ExpressEdition2008を使っています。
  • 孫ボタンをクリックしたらwindprocにメッセージが飛ばない問題が発生しています。親をAに変更すると正常に動作しますが、孫ウインドウからメッセージを飛ばす方法はあるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.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の方法は、何らかの方法で親ウィンドウハンドルを孫ウィンドウでアクセスできるようにしておく必要があります。

midugane
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.2

孫ウィンドウから見て、子ウィンドウの上に親ウィンドウがあるかどうかはわかりませんから、孫ウィンドウが直接親ウィンドウにWM_COMMANDメッセージを送信することはできないでしょう。 解決方法としては・・・ 1.子ウィンドウのwindprocに孫ウィンドウから送信されたWM_COMMANDメッセージを親ウィンドウに送信する(中継)。 2.孫ウィンドウをサブクラス化して孫ウィンドウのwindprocを置き換え、直接WM_COMMANDメッセージを親ウィンドウに送信する。 あたりですかね・・・

midugane
質問者

補足

親の配下なんだから当然メッセージも飛ぶものだと思ってました。 1の方法ですがそんな事が出来るんですか!? 具体的な手法かもしくは参考ページとかあったら教えていただけないでしょうかm(_)m 2の方法を試してみたんですがコンパイルはできるもののウンともスンとも言いませんでした。 こっちはもう少し勉強してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

普通は、親ウィンドウを検索してそこにイベント通知します。 http://www.geocities.jp/ky_webid/win32c/062.html http://www.nitoyon.com/vc/reference/gui/static.htm 参考に。

midugane
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語とWin32APIで全角かなの文字を取得する方法について。

    いつも、お世話になっております。 小生、只今、WinXPSP3上でC言語とWin32APIを使い、BCC5.5.1でコンパイルしながら、Windowsプログラミングを勉強しています。 今回、ご質問させて頂きたい内容は、 クライアント領域において、全角かなの文字を取得する方法についてです。 自分自身で考えてみたのですが、WM_CHARメッセージの箇所を工夫して利用し、文字を取得する方法と、エディットコントロールにて文字を取得する方法です。 自分自身、WM_CHARメッセージを最近、勉強し始めたところなので、 出来ればWM_CHARメッセージを使用し、処理してみたいのですが。。。 以上です。 お忙しい中、本当に申し訳ございませんが、先輩方アドバイス宜しくお願いします。

  • C++(API)で

    C++(API)でクライアント領域にボタンを貼り付けるところまではできるのですが・・・そのボタンを押すと新しいウィンドウを表示させるにはどうしたらよろしいのでしょうか?

  • Win32APIを始めたのですが・・・。

    Window Handleについての質問です。Win32APIではCreateWindow()でチェックボックスを作ることが出来るのですが、 C++でプログラミングしていたところ、困ったことになりました。 まず、クラスのメンバーとしてHWND m_Hwndを宣言し、メンバー関数(CreateChk())において m_Hwnd = CreateWindow(...)とし、WM_CREATEのメッセージ処理内で関数CreateChk()を呼び出して チェックボックスを作るようにしたのですが、WM_CREATEのメッセージ処理を終えると同時にm_Hwndの内容が意味を持たないものに 変わってしまい、チェックボックスの状態を利用することが出来ません。 変数の寿命に関係したものだとは思うのですが、クラスを用いたオブジェクト指向プログラミングも始めたばかりでよくわかりません。 どなたか対処方法をご存知でないでしょうか?

  • Win32 APIを使ったWindowsプログラミング製作について質問です

    只今、VisualStudio2005のVC++でWin32 APIを使ってWindowsアプリケーション製作の練習をしています。今、ドラゴンクエストIのようなゲームを作りたいと思っており、画面に画像を表示し、キーボードの十字キーで操作できるようにしていますが、ここまでやっていて一つ不思議に思ったことがあります。それは、画像の読み込みや表示・キーボードの入力などすべてをウィンドウプロシージャ内にコーディングしています。WinMain()関数内には、ウィンドウの登録・生成・表示という当たり前の処理しかありません。これから、戦闘の処理なども加えていきますが、それを考えてもWM_PAINTやWM_KEYDOWNなどのメッセージ内で事足りるような気がします。アプリの製作の経験はほとんどない初心者なので、C言語みたいにMain()関数内にほとんど処理を記述しないのが不安に思います。自分の書き方は間違っているのかどうなのか、何か参考になる意見をいただけないでしょうか?どうかよろしくお願い致します。

  • Win32 APIに関する質問

    Win32 APIでwidowsプログラミングをしているのですが、 メニューを開きとあるダイアログを開きボタン(これを押すとエディットから、入力されている文字列を取得する) を押すとエディットに入力されている、文字列をメッセージボックスに表示するはずなんですが (Messengerはその問題のボタンがついているプログラム) 「Messenger が原因で USER.EXEにエラーが発生しました。Messenger は終了します」 と出てそのプログラム(Messenger)が、終了させられてしまいます。 GetDlgText()というAPIが原因だと言う所までは分かりましたが、そこからさきがまったく分かりません このバグの解決方法を教えてください ↓がソースです(結構長いのでダイアログのコールバックだけ書きます) BOOL CALLBACK Dialog_RoomOption(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp){ int error; LPTSTR s; HWND edit_RoomAbout; switch(msg){ case WM_INITDIALOG: SetDlgItemText(hwnd,EID_PASSWORDEDIT,"パスワードを入力してください"); return TRUE; case WM_COMMAND: switch(LOWORD(wp)){ case BID_CREATE: GetDlgItemText(hwnd,EID_PASSWORDEDIT,RoomPassword,sizeof(RoomPassword)); MessageBox(hwnd,RoomPassword,TEXT("TESTTEST"),MB_OK); EndDialog(hwnd,BID_CREATE); return TRUE; } break; case WM_CLOSE: EndDialog(hwnd,NULL); return TRUE; } return FALSE; }

  • Win32APIを使って入力されたキーによって表示する画像を変えるプログラムについて

    Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、 上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(hMemdc,hbitmap); GetObject(hbitmap,sizeof(BITMAP),&bitmap); BitBlt(painthdc,0,0,350,467,hMemdc,0,0,SRCCOPY); } という処理をしてaが入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。

  • 孫ウィンドウから親ウィンドウを操作

    javascriptを使用して以下の物を作りたいと考えています。 1.親ウィンドウから子ウィンドウを開く 2.子ウィンドウから孫ウィンドウを開き、自動的に子ウィンドウを閉じる 3.孫ウィンドウから親ウィンドウのページを切り替え、自動的に孫ウィンドウを閉じる 2までは出来たのですが、3は子ウィンドウを閉じてしまう為にopenerが使えません。 他の方法も調べてみたのですが、どうしてもうまくいきませんでした。 何か良い方法はないでしょうか?

  • C#プログラミングに役立つAPIの本???

    もっぱらC#を使用しています C言語のプログラム遺産の活用等には全く縁の無い私です だから今後もC#だけで行こうと思っております VC++などに移る気などサラサラありません それ故に、念のために ・・・・・ 実は内心では心配だから、APIだけは勉強しておこうと思って教科書を探しました 日経ソストウエアが出版している『APIで学ぶWINDOWS』¥2095を購入しましたが的外れ! ウインドウズの解説本でありプログラミングには役立ちません 更にC#プログラミングに役立つAPIの本を探したのですが、適当なものが見つかりません ご存知でしたら教えてください、お願い申し上げます

  • C言語とWin32APIで全角のカタカナの文字を取得、表示する方法について。

    いつも、お世話になっております。 小生、只今、WinXPSP3上でC言語とWin32APIを使い、BCC5.5.1でコンパイルしながら、Windowsプログラミングを勉強しています。 今回、ご質問させて頂きたい内容は、 1.ウィンドウを作成。 2.1で作成したウィンドウに全角のカタカナを1文字入力。 3.入力されたカタカナを入力した箇所の下に描画。 4.再度、カタカナの文字があった場合は、入力されている文字を消去し、2のステップに戻る。 5.カタカナ以外の文字が入力された場合はメッセージボックスにて、   "カタカナ以外の文字が入力されました"を出現させ、クライアント領域には何も描画しない。 以上です。 前回、同じような質問を投稿させて頂いた際に、WM_CHARメッセージの箇所を工夫して利用し、文字を取得する方法をお教え頂いたので、WM_CHARメッセージでの処理の仕方をご教授願いたいと思っております。 そして、あつかましいようで申し訳ございませんが、ソースを記述して頂く際、C言語での記述で宜しくお願い致します。 以上です。 色々とわがままを言い、本当に申し訳ございません。 お忙しい中、本当に申し訳ございませんが、先輩方アドバイス宜しくお願いします。

  • コンソールアプリケーションでのWIN32 APIメッセージ処理

    コンソールアプリケーションでのWIN32 APIメッセージ処理 VisualStdio.NET 2005のC++で作成しているコンソールアプリケーションで、 PostMessageでメッセージを送信しているのに、PeekMessageで検出できません。 下のプログラムに誤った点があるのでしょうか? 尚、ウィンドウハンドルの確認部分はパスしますが、 PostMessageとPeekMessageの引数hWndをNULLに置き換えるとメッセージの検出はできるので、 やはり、ウィンドウハンドルに問題があるのかもしれません。 #include <windows.h> #include <stdio.h> void main( void ) {   char OldTitle[1024], NewTitle[1024];   char WindowText[1024], ConsoleTitle[1024];   HWND hWnd;   MSG Msg;   /*** ウィンドウハンドルの取得 ***/   GetConsoleTitle( OldTitle, 1024 );   wsprintf( NewTitle, "%d/%d", GetTickCount(), GetCurrentProcessId());   SetConsoleTitle( NewTitle );   Sleep(40);   hWnd = FindWindow( NULL, NewTitle );   SetConsoleTitle( OldTitle );   /*** ウィンドウハンドルの確認 ***/   GetWindowText( hWnd, WindowText, 1024 );   GetConsoleTitle( ConsoleTitle, 1024 );   if ( strcmp( WindowText, ConsoleTitle ) != 0 ){     printf( "ウィンドウハンドルが不正です" );     return;   }   /*** メッセージの送信と検出 ***/   PostMessage( hWnd, 1050, 0, 0 );   do{     while ( PeekMessage( &Msg, hWnd, 0, 0, PM_REMOVE )){       printf( "メッセージを検出しました" );       return;     }   } while( 1 ); }