ゆとりーなの日記

日記的な事を書いて行くと思はれる

みんなマイクロソフトが嫌いなの?

昨日は雪降りました。積りました。雪かきの流れです。たまにやる雪かきは楽しいですね。あと今日は都合によりC++でシューティング作りますか第1回ではありません。第1回がいつ行われるかは未定なんです。

またタイトルと記事内容が一致しているぞ

ひょっとして3回連続一致してるんじゃないんですか。変なタイトルはtwitterの方に流れるようになったからですかね。twitter強いですね。今日の話はMSDN無視したサンプルコードがwin32の解説ページに多い気がしたのでやってみました。

メッセージループは-1もチェックしようよ!

メッセージループが何かについては説明が面倒なので割愛します。win32の解説ページを適当に調べてください。流石にこれについて変なこと言っているページは見たことありません。
で、よくwin32の解説ページで見られるメッセージループはこちらです。

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

ウィンドウ終了要請があった時(要はWM_QUITを受け取った時)、GetMessageが0を返すことを利用したコードです。ところがこのコードは避けてくださいとMSDNに書いてあります。GetMessageはエラーを起こすと-1を返すからです。因ってGetMessageの返り値をちゃんと取得して、-1の時にはループを抜ける処理を書いておくのが残当です。因みにGetMessageの返り値はBOOLです。BOOLなのに0と非0以外を判別するのは変な気もしますがそこはwin32だからということで。

WinMainの返り値をテキトーにごまかすのやめようよ!

MSDNによると、WinMainの返り値をどうすべきかどうかがちゃんと書いてあります。メッセージループ突入前は0、突入後はmsg.wParamの値を返しましょうと書いてあります。ところがwin32の解説ページを見てみると、なんか知らないけど常に0を返すもの、何を思ったかメッセージループ突入前にエラー起こしたら-1を返す物など様々です。まあ実際には殆どの場合返り値は0になるんですけどちゃんとMSDNの言うことを聞いてあげましょう。

それでもハンガリアンは使われる!

MSDNの記述を無視したコードが氾濫しているにもかかわらず、ハンガリアン記法は殆どのwin32解説サイトでみられます。DWORD型の変数名は粗例外なくdwから始まってますね。この手のハンガリアンは害悪性の方が大きいのでこういうのを真似しないべきなんですよ。個人的にはg_、m_とかから始まるスコープ基準のハンガリアンもあまり好きではないですが、こっちはまだ理があるのでありだと思います。しかし型名基準のハンガリアンはwin32のコードだからと言って使用するのはどうかと思います。