• ベストアンサー

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; }

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.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を返してやれば良いだけだ。

breeze2000
質問者

お礼

anmochi 様 ご回答有難う御座います なるほど~、良く解りました 特に >なんでもかんでも 0 を返せば良いという訳ではない。 >ハンドル後に 0 を返しているのは意味が分かってやっているなら問題ない の所が、私のような初心者の場合は、意味が解ってない事もあると思いますので、CALLBACK の return に DefWindowProc を使った方が良いと思いえました 私の所持する参考書(複数)は、両方の書き方があったので、どちらが良いのか気持ち悪かったのですが、すっきりしました 有難う御座いました それと >switch は、 default を入れた方が正式と思いますが この書き方は良く無かったです、ごめんなさい switch の構文や if 文 など、全部(default や else) を使って完結させた方が、私の個人的な所で、正式っぽい様な感じがする の方が良い表現だったと思います ( あまり深く考えてませんでしたので、スルーでお願い致します )

その他の回答 (1)

回答No.1

お疲れ様です。 ほぼ、好みの問題です。 例えばウィンドウの「×」ボタン押下などにより「WM_CLOSE」メッセージを受信した時に、ウィンドウを閉じないよう「DefWindowProc」を実行したくない場合などがあります。 そんな時、前者の書き方ではswitch-case内でreturn文を記載する必要があり、プログラムの流れが見にくくなる可能性があります。 後者では、DefWindowProcを各case文の中に含める必要があります。 どちらが良いとも言えないでしょう。

breeze2000
質問者

お礼

hiro_knigh 様 ご回答有難う御座います >ほぼ、好みの問題です。 やっぱり好みなんですね 今読んでいる参考書が、switch 内の default に DefWindowProc を記述しています 前に読んでいた参考書が、CALLBACK の return に DefWindowProc を記述しています 前に読んでいた方が C がベースで、今読んでいる方が CPP がベースです 読んでいる参考書が新しい ( 出版に5年位の差が有ります ) ので、新しい方が良い記述方法なのかな、でも私のコードは DefWindowProc が増えてやだなぁ と思っていた所です これで、参考書の DefWindowProc の部分を置き換えて、すっきり 読んで行けます 有難う御座いました

関連するQ&A