- ベストアンサー
CALLBACK 内の DefWindowProc の場所
こんにちは、最近 無料版Borland C++Compiler 5.5 を使って WIN32 API の勉強をしています 気にしなければ別に問題ないのですが、どうしても気になって気持ち悪いので、質問させて下さい 参考書や Web でコード例を見ていると、CALLBACK 内の DefWindowProc関数 を switch の default にする例 と switch の default を書かずに CALLBACK の return にする例があります 好みの問題なのでしょうか? switch は、 default を入れた方が正式と思いますが、default に DefWindowProc を記述すると コードが長くなるにつれ DefWindowProc が switch 内でちょこちょこ必要になってきます 私は、switch の default があった方が良いかなと思い DefWindowProc を default に記述していますが、コードが短くなるなら CALLBACK の return に DefWindowProc を記述しようと思っています どちらが良いのでしょうか? 暇な時でかまいませんので、ご教授下さい 宜しくお願い致します ※DefWindowProc の 記述場所を CALLBACK の return にする LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); break; } /*基本的なメッセージの処理*/ return DefWindowProc(hWnd, uMsg, wParam, lParam); } ※DefWindowProc の 記述場所を switch の default にする LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); break; default: /*基本的なメッセージの処理*/ return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
私個人は前者の方が良い(default無し)と思う。 そもそもswitchにdefaultを入れるのが正式という考えがよく分からん。defaultはif構文で言えばelseにあたる。if構文にelseに当たる処理が無ければいちいち書いたりしないように、switch文でもdefaultにあたる処理が無ければ書かない方が正式なのではないかな。どうしても正式なら、前者のプログラムでdefaultブロックを書いた上で処理を空白にしておけば良い。 さて、前者と後者でプログラムの意味を考えると、WindowProcがリターンする値の意味は当然メッセージによって変わってくるので、なんでもかんでも0を返せば良いという訳ではない。そういう意味で後者のプログラムでWM_DESTROYメッセージのハンドル後に0を返しているのは意味が分かってやっているなら問題ないが、これは安全な方法とは言えないだろう。 仮に、WindowsがWindowProcからメッセージに対する不正なリターン値を受け取ったらエラーを表示するような仕組みになっていた場合、前者のプログラムは安全性(Windowsにリターンする値がWindowsが定義した値になるため)を、後者のプログラムは完全性(エラーというかリターン値の不正をきちんとエラーとして処理させる)を取った形式と言える。また、Microsoftはパラノイアと言っても良いくらいAPIの互換性に気を使っているが、WM_DESTORYを処理した後でWindowsに返すべき値がWindows 95とWindows Vistaでは違うというパターンもおこりうるだろう。その場合も0固定で返すよりもDefWindowProcを返す方が良いと言える。 リターン値が特別になるのなら個別に返すべきだ。仮に、PostQuitMessage()に失敗したら-1を返さなきゃいけない仕様になっていたとしたら、 LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg){ case WM_DESTROY: if(PostQuitMessage(0) == ERR_FAILER){ return -1; } break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } として、CASE WM_DESTORY内で独自に-1を返してやれば良いだけだ。
その他の回答 (1)
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
お疲れ様です。 ほぼ、好みの問題です。 例えばウィンドウの「×」ボタン押下などにより「WM_CLOSE」メッセージを受信した時に、ウィンドウを閉じないよう「DefWindowProc」を実行したくない場合などがあります。 そんな時、前者の書き方ではswitch-case内でreturn文を記載する必要があり、プログラムの流れが見にくくなる可能性があります。 後者では、DefWindowProcを各case文の中に含める必要があります。 どちらが良いとも言えないでしょう。
お礼
hiro_knigh 様 ご回答有難う御座います >ほぼ、好みの問題です。 やっぱり好みなんですね 今読んでいる参考書が、switch 内の default に DefWindowProc を記述しています 前に読んでいた参考書が、CALLBACK の return に DefWindowProc を記述しています 前に読んでいた方が C がベースで、今読んでいる方が CPP がベースです 読んでいる参考書が新しい ( 出版に5年位の差が有ります ) ので、新しい方が良い記述方法なのかな、でも私のコードは DefWindowProc が増えてやだなぁ と思っていた所です これで、参考書の DefWindowProc の部分を置き換えて、すっきり 読んで行けます 有難う御座いました
お礼
anmochi 様 ご回答有難う御座います なるほど~、良く解りました 特に >なんでもかんでも 0 を返せば良いという訳ではない。 >ハンドル後に 0 を返しているのは意味が分かってやっているなら問題ない の所が、私のような初心者の場合は、意味が解ってない事もあると思いますので、CALLBACK の return に DefWindowProc を使った方が良いと思いえました 私の所持する参考書(複数)は、両方の書き方があったので、どちらが良いのか気持ち悪かったのですが、すっきりしました 有難う御座いました それと >switch は、 default を入れた方が正式と思いますが この書き方は良く無かったです、ごめんなさい switch の構文や if 文 など、全部(default や else) を使って完結させた方が、私の個人的な所で、正式っぽい様な感じがする の方が良い表現だったと思います ( あまり深く考えてませんでしたので、スルーでお願い致します )