- ベストアンサー
SendMessageの使い方について
- SendMessageを使ってプログラムを完成させたいのですが、どこを修正すれば良いのでしょうか?
- 上記のサンプルプログラムを実行すると、SendMessageが動いていないため、新規に作成したカーソルが表示されないと思われます。
- 以下のように修正すれば、SendMessageを使わなくても正しく動くことは分かっています。case WM_SETCURSOR: hCrsrButton = LoadCursor((HINSTANCE)GetWindowLong(hButton,GWL_HINSTANCE),MAKEINTRESOURCE(IDC_BUTTON));SetCursor(hCrsrButton);break;
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
//不要 //#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; 省略 という感じかな?
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>オリジナルが動かないことが不思議です。 VitaminBBさんのOSはXPですか? サンプルはWinMe以前のようですし。 バージョンが変わって内部処理が変更になったのでしょう。 >やはり”既存”のコントロールに使ったことがまずいのでしょうか? ブラックボックス化されているウィンドウには WM_USERは使えないということで。 つまり、サンプルのバグです。 "sukinamojiretsu"なんですが、他のプロセスがRegisterWindowMessageで登録した文字列とかぶらなければ、何でもかまいません。 同じ文字列を使用すると、同じメッセージIDが返されますのでおかしなことになるかもしれません。 他の使い方としては、プロセス間で独自のメッセージIDでメッセージを送信するときに、同一の文字列でRegisterWindowを呼び出して使用します。
お礼
回答ありがとうございます。
補足
>VitaminBBさんのOSはXPですか? WIN98 VC++6.0です >つまり、サンプルのバグです。 そういうことで納得です。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
あと、このサンプル、WM_FIRSTにWM_USERを使ってるのはまずいですね。 既存のコントロールに対して独自のメッセージを投げたいときは、WM_USER(およびそれ以降)は使わないほうがいいですよ。 理由は、コントロール内部でも使用される可能性があるからです。作ったときは動いていても、Windowsのバージョンが変わって動作が変わるかもしれませんし。 今回のようなケースでは、RegisterWindowMessageを使用してメッセージIDを取得し、それを使用するようにします。 もし、PostMessageにしても動かなかったらこちらも試してみてください。
お礼
RegisterWindowMessageの使い方が分かりません。 今回の例で具体的にどう記述すれば良いか教えていただけると助かります。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
SendMessageじゃなくて、PostMessageにすれば動くと思います。 あとは、SendMessageの次の行のbreak;を return TRUE; に変えてみるとか。 未確認です。
お礼
回答ありがとうございます。 やってみましたが、変わり有りませんでした。
お礼
コードありがとうございます。 期待どおり動きました。
補足
オリジナルが動かないことが不思議です。 あれから調べてみたのですが、SendMessageの使い方も特に問題ないと思うのですが、やはり”既存”のコントロールに使ったことがまずいのでしょうか? RegisterWindowMessageも面白い関数ですね。 "sukinamojiretsu"を登録してもその後”sukinamojiretsu”そのものは使わないのですね。