• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SendMessageの使い方について)

SendMessageの使い方について

このQ&Aのポイント
  • SendMessageを使ってプログラムを完成させたいのですが、どこを修正すれば良いのでしょうか?
  • 上記のサンプルプログラムを実行すると、SendMessageが動いていないため、新規に作成したカーソルが表示されないと思われます。
  • 以下のように修正すれば、SendMessageを使わなくても正しく動くことは分かっています。case WM_SETCURSOR:   hCrsrButton = LoadCursor((HINSTANCE)GetWindowLong(hButton,GWL_HINSTANCE),MAKEINTRESOURCE(IDC_BUTTON));SetCursor(hCrsrButton);break;

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

//不要 //#define WM_FIRST WM_USER 省略 WNDPROC OrgProc; //追加 UINT guiFirst; //登録メッセージ 省略 ------------------------------ case WM_INITDIALOG: 省略 //メッセージIDの登録 guiFirst = RegisterWindowMessage("sukinamojiretsu"); //登録したメッセージをボタンに送信 //SendMessage(hButton,WM_FIRST,0L,0L); SendMessage(hButton,guiFirst,0L,0L); break; 省略 ------------------------------ 省略 //guiFirstは、定数ではないのでcase文で判断不能のため //ifで個別に確認する必要あり if(msg == guiFirst) { hCrsrButton = LoadCursor((HINSTANCE)GetWindowLong(hButton,GWL_HINSTANCE),MAKEINTRESOURCE(IDC_BUTTON)); return TRUE; } switch(msg){ //削除 //case WM_FIRST: //hCrsrButton = LoadCursor((HINSTANCE)GetWindowLong(hButton,GWL_HINSTANCE),MAKEINTRESOURCE(IDC_BUTTON)); //break; case WM_SETCURSOR: SetCursor(hCrsrButton); break; 省略 という感じかな?

VitaminBB
質問者

お礼

コードありがとうございます。 期待どおり動きました。

VitaminBB
質問者

補足

オリジナルが動かないことが不思議です。 あれから調べてみたのですが、SendMessageの使い方も特に問題ないと思うのですが、やはり”既存”のコントロールに使ったことがまずいのでしょうか? RegisterWindowMessageも面白い関数ですね。 "sukinamojiretsu"を登録してもその後”sukinamojiretsu”そのものは使わないのですね。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>オリジナルが動かないことが不思議です。 VitaminBBさんのOSはXPですか? サンプルはWinMe以前のようですし。 バージョンが変わって内部処理が変更になったのでしょう。 >やはり”既存”のコントロールに使ったことがまずいのでしょうか? ブラックボックス化されているウィンドウには WM_USERは使えないということで。 つまり、サンプルのバグです。 "sukinamojiretsu"なんですが、他のプロセスがRegisterWindowMessageで登録した文字列とかぶらなければ、何でもかまいません。 同じ文字列を使用すると、同じメッセージIDが返されますのでおかしなことになるかもしれません。 他の使い方としては、プロセス間で独自のメッセージIDでメッセージを送信するときに、同一の文字列でRegisterWindowを呼び出して使用します。

VitaminBB
質問者

お礼

回答ありがとうございます。

VitaminBB
質問者

補足

>VitaminBBさんのOSはXPですか? WIN98 VC++6.0です >つまり、サンプルのバグです。 そういうことで納得です。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

あと、このサンプル、WM_FIRSTにWM_USERを使ってるのはまずいですね。 既存のコントロールに対して独自のメッセージを投げたいときは、WM_USER(およびそれ以降)は使わないほうがいいですよ。 理由は、コントロール内部でも使用される可能性があるからです。作ったときは動いていても、Windowsのバージョンが変わって動作が変わるかもしれませんし。 今回のようなケースでは、RegisterWindowMessageを使用してメッセージIDを取得し、それを使用するようにします。 もし、PostMessageにしても動かなかったらこちらも試してみてください。

VitaminBB
質問者

お礼

RegisterWindowMessageの使い方が分かりません。 今回の例で具体的にどう記述すれば良いか教えていただけると助かります。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

SendMessageじゃなくて、PostMessageにすれば動くと思います。 あとは、SendMessageの次の行のbreak;を return TRUE; に変えてみるとか。 未確認です。

VitaminBB
質問者

お礼

回答ありがとうございます。 やってみましたが、変わり有りませんでした。

関連するQ&A