7080 + 1

ゲームプログラミングの記事を書いてます。

WindowsなんだからWindowsAPIも知る必要がある

学生時代の自分のDirectXのプログラムを見ていると、先生からもらったサンプルをそのまま意味もわからず使っているケースがあります。 特にWindowsAPI周りが意味不明で、この関数呼んでる意味あんのか?と思ったりすることもあります。

しかし調べてみると、意味のある処理が非常に多かったので、忘れないようにメモしておこうと思います。 ちなみに、独自解釈が多々入っているので、間違っている可能性があります。その時はご指摘いただければと思います。

ValidateRect(HWND, CONST RECT*)

過去の自分のプログラムのコメントを見ると、「WM_PAINTを呼ばないようにする」と書いてありました。 WM_PAINTというのは、WindowsAPIで毎フレーム呼ばれる、描画メッセージです。つまり、DirectX使わなくても、WindowsAPIだけで画面描画することはできます。 ですがそれでテクスチャつけて3Dモデル動かして・・・なんてやってられません。描画をDirectXだけでやりたいなら、このメッセージが飛ばないようにして、処理を少しでも軽くしてやりましょう。 第一引数にウィンドウハンドル、第二引数にNULLを渡してやれば、そのウィンドウではWM_PAINTは呼ばれなくなるみたいです。(確かめてない)

GetClientRect(HWND, RECT*)

これ意外と大事です。Windowsのウィンドウには、外枠がありますよね。ウィンドウのタイトル表示してたり、閉じるボタン、最小化ボタンがあるところです。 左右と下にもわずかですが枠があります。CreateWindow()呼ぶときに幅と高さを指定しますが、これはその枠を含めたサイズでウィンドウを作ります。

ですが実際にゲームの描画が行われるのはその枠を覗いた領域のみです。これを「クライアント領域」と言います。この関数はそれを取得できます。(枠がないクライアント領域のみのウィンドウを作ることも可能です) ウィンドウのサイズそのままでDirectXの描画を行うと、きっと小さなズレが生まれるでしょう。ゲームを作る上で、クライアント領域を覚えておくのは必須といえます。

今回は2つ紹介しました。全部WindowsAPIです。使い方は全て調べていただければ普通に出てきます。 DirectXの学習も大切ですが、こういった部分は一度設定するとそのまま変えないので、忘れがちになると思います。 また何か紹介できるものがあれば書いていきたいと思います。