WM_USERとPostMessageを使用したプログラムを作成中です。ダイアログベースではうまくいっ
たのに、SDIでは、応答がなくなりました。ダイアログベースとSDIではなにか違いがあるので
しょうか?
開発環境は、Windows2000、VC++6.0、MFCです。
プログラムは、以下のようになっています。
#define WM_READ WM_USER+5
HWND hWnd;
afx_msg LRESULT OnRead(WPARAM w,LPARAM l);
//マクロ
ON_MESSAGE(WM_READ,OnRead)
void Func1(void)
{
...
::PostMessage(hWnd,WM_READ,0,0);
...
}
LRESULT OnRead(WPARAM w,LPARAM l)
{
...
}
これだけじゃ、わからんです。
その PostMessage を外したらうまく動作しますか?
あと、プログラマ定義の WindowsMessageID は、WM_USER ではなく、WM_APP を
使うことが推奨されています。
SDIでもPostMessageやON_MESSAGEが使えるはず。
ウィンドウハンドルが間違えているとか?
応答がなくなりましたっていうとフリーズかと思ってしまう。
> あと、プログラマ定義の WindowsMessageID は、WM_USER ではなく、WM_APP を
> 使うことが推奨されています。
ん?
・WM_APPはアプリケーション全体を通して意味ある値
・WM_USERはそのウィンドウクラス専用の値
という使い分けであって,どちらかを推奨してはいないと思うのですが……。
# とりあえず,私はMSDNから読み取れなかった。
上記の理由から,WM_USERをダイアログに使う方が非常にまずいような……。
昔の話なので正確に覚えてない。
WM_USERがよく使われ
WM_USERじゃなくてWM_APPを使えに代わったのが
昔はWM_APPがなかったから。
Microsoftの公式な発表なのかわからない。
昔はWindowsの本なんて著名なのが少ししかなく
WM_USER+小さい数字は避けましょうって書いてあった。
というか当時はインターネットが存在しないから
Microsoftの公式な発表か確認なんて出来ねーな。アハハ
WM_USER+小さい数字は
いくつかダイアログやコントロールで使っているからね。
普通のウィンドウならOkってことになるけど
ダイアログに予定変更なんてこともあるかもしれないし
人間完璧じゃない
うっかりミスやすっかり忘れてしまうこともあるし。
あいまいな表現でもうしわけありません。
アプリケーション自体はフリーズすることなく動作しています。
PostMessageによるメッセージ処理の反応がないだけで、あとは特に問題ありません。
WM_USERについては、たしかにMFCも使用しているので「WM_USER+小さい値」は、避けたほうが
よいという資料もありましたので、WM_USER+10やWM_USER+100など、大きな値でも確かめまし
たが、動作しませんでした。
>hWnd
ってどこで代入していますか?
>ON_MESSAGE(WM_READ,OnRead)
単独で記述している?
>OnRead
メンバ関数ではない?
出来るだけ情報を省略しないで載せてもらえませんか?
それと、最低限のコード(他の記述を一切書かないでPostMessageだけ正しく動くかどう
かのミニマムコード)でも再発するか確認してみてはどうでしょうか?
たぶんメッセージを投げている先が問題なのでは?
フレームとビューの区別はちゃんとついてますか?
WM_APP使った方がいいというのはMSDNのこのページのことじゃないでしょうか。
http://support.microsoft.com/kb/86835/ja
http://msdn2.microsoft.com/en-us/library/ms644930.aspx
一部のコントロールでWM_USERの範囲内に定義されていると書いてあるようです。
ウインドウクラスから定義した自作のコントロールを作る場合とか
WM_USERの方がよい場合もありますので、使い分けが重要なんじゃないでしょうか。
今回のように単一のアプリでしか使われないようなウインドウなら
WM_APPの方がよいと思います。
本題の件に関してはやっぱりウインドウハンドルが間違っているんじゃないかな?と。