こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SendMessageの使い方について

http://kerochan.no-ip.com/vcsdk/letsprog/chap30.htm

上記のサンプルプログラムを実行すると、SendMessageが動いていないため、新規に作成したカーソルが表示されないと思われます。

SendMessageを使ってプログラムを完成させたいのですが、
どこを修正すれば良いのでしょうか?

お分かりの方、どうぞよろしくお願いします。



**************************
以下のように修正すれば、SendMessageを使わなくても正しく動くことは分かっています。
case WM_SETCURSOR:
   hCrsrButton = LoadCursor((HINSTANCE)GetWindowLong(hButton,GWL_HINSTANCE),MAKEINTRESOURCE(IDC_BUTTON));

SetCursor(hCrsrButton);
break;

投稿日時 - 2003-07-26 10:38:35

QNo.611492

困ってます

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

//不要
//#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;

省略

という感じかな?

投稿日時 - 2003-07-26 14:25:31

補足

オリジナルが動かないことが不思議です。

あれから調べてみたのですが、SendMessageの使い方も特に問題ないと思うのですが、やはり”既存”のコントロールに使ったことがまずいのでしょうか?

RegisterWindowMessageも面白い関数ですね。
"sukinamojiretsu"を登録してもその後”sukinamojiretsu”そのものは使わないのですね。

投稿日時 - 2003-07-26 15:04:40

お礼

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

投稿日時 - 2003-07-26 15:00:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>オリジナルが動かないことが不思議です。

VitaminBBさんのOSはXPですか?
サンプルはWinMe以前のようですし。

バージョンが変わって内部処理が変更になったのでしょう。

>やはり”既存”のコントロールに使ったことがまずいのでしょうか?

ブラックボックス化されているウィンドウには
WM_USERは使えないということで。
つまり、サンプルのバグです。


"sukinamojiretsu"なんですが、他のプロセスがRegisterWindowMessageで登録した文字列とかぶらなければ、何でもかまいません。

同じ文字列を使用すると、同じメッセージIDが返されますのでおかしなことになるかもしれません。

他の使い方としては、プロセス間で独自のメッセージIDでメッセージを送信するときに、同一の文字列でRegisterWindowを呼び出して使用します。

投稿日時 - 2003-07-26 17:25:41

補足

>VitaminBBさんのOSはXPですか?
WIN98 VC++6.0です


>つまり、サンプルのバグです。
そういうことで納得です。

投稿日時 - 2003-07-26 17:55:30

お礼

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

投稿日時 - 2003-07-26 17:55:06

ANo.2

あと、このサンプル、WM_FIRSTにWM_USERを使ってるのはまずいですね。
既存のコントロールに対して独自のメッセージを投げたいときは、WM_USER(およびそれ以降)は使わないほうがいいですよ。

理由は、コントロール内部でも使用される可能性があるからです。作ったときは動いていても、Windowsのバージョンが変わって動作が変わるかもしれませんし。

今回のようなケースでは、RegisterWindowMessageを使用してメッセージIDを取得し、それを使用するようにします。

もし、PostMessageにしても動かなかったらこちらも試してみてください。

投稿日時 - 2003-07-26 11:54:33

お礼

RegisterWindowMessageの使い方が分かりません。

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

投稿日時 - 2003-07-26 12:27:18

ANo.1

SendMessageじゃなくて、PostMessageにすれば動くと思います。

あとは、SendMessageの次の行のbreak;を
return TRUE;
に変えてみるとか。

未確認です。

投稿日時 - 2003-07-26 11:39:20

お礼

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

やってみましたが、変わり有りませんでした。

投稿日時 - 2003-07-26 12:01:54

あなたにオススメの質問