古の技術でゲームプログラミング 第5回

 

クライアント領域の大きさからウインドウの大きさを求める方法についてです。

 

 

そもそもCreateWindowに渡すウインドウの幅と高さは↓の絵でいうところのnWidth, nHeightにあたる部分になります。

 

ゲーム用にウインドウを作ろうと思ったら、通常はゲーム画面を描画するための領域であるクライアント領域の大きさを決めたいところ。

 

しかしCreateWindowでは直接クライアント領域の大きさを指定することができません。使えないな。

 

 

ってことで、クライアント領域の大きさから、ウインドウの外枠を含めた大きさを求める方法について書いていきたいと思います。

 

 

使うAPIはAdjustWindowRectです。

コレにクライアント領域の矩形(いわゆる四角)の情報とウインドウスタイル、メニュー有無を指定することで、ウインドウの外枠部分の矩形情報を得ることができます。

 

コード例:

幅:960pixel, 高さ540pixelの場合

   
   RECT rect;

   // クライアント領域の左上、右下座標
   rect.left = 0;
   rect.top = 0;
   rect.right = 960 - 1;
   rect.bottom = 540 - 1;

   AdjustWindowRect(
       &rect,                   // クライアント領域の矩形情報
       WS_OVERLAPPEDWINDOW,     // ウインドウスタイル
       true);                   // メニュー有無

   // AdjustWindowを呼ぶとrectの内容がウインドウの左上、右下座標に更新される

   HWND hWnd = CreateWindowW(
       szWindowClass, szTitle,
       WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT,
       0,
       rect.right - rect.left + 1,  // 座標から幅を計算
       rect.bottom - rect.top + 1,  // 座標から高さを計算
       nullptr,
       nullptr,
       hInstance,
       nullptr);

 

事前にRECT構造体を定義して、クライアント領域の左上、右下の座標をセットしておきます。

大きさだけを求めたいならleft, topは0、right, bottomは幅-1, 高さ-1の指定でおっけー。

これをAdjustWindowRectに渡します。

 

他2つのパラメータは実際に作るウインドウに合わせればよいです。

2個目はCreateWindowに渡すウインドウスタイル(例ではWS_OVERLAPPEDWINDOW)を設定し、3個目のメニュー有無はRegisterClassでメニューの設定をしたならtrue, してなければfalseで良い。

 

ただ、メニューに関しては注意が必要で、横長のメニューの場合、ウインドウの幅が狭いと2行表示になりますが、AdjustWindowRect関数はメニューの2行表示は考慮してくれないので、2行表示になってしまいそうな場合は違う方法をとる必要があると思います。

 

私は基本メニューなしのウインドウにしちゃうので、メニューが2行になるケースについてはどうしたらいいかわからナーイ。

 

 

で、AdjustWindowRectを抜けたら渡したRECT構造体にウインドウの外枠の座標が入っているので、この座標からウインドウの幅、高さを計算します。

 

これまた左上、右下座標になっているので計算式は以下になるはず。

  幅 = right - left + 1

  高さ = bottom - top + 1

 

同じRECT構造体でもAPIによっては座標が入ってたりそのまま幅、高さが入ってたりで異なるので注意が必要です。

 

 

あ、ちなみに今回はウインドウサイズは固定せず変更できるようにしてるので、クライアント領域のサイズにこだわる必要はあんまりないかもしれない。

でも初期表示くらい狙った大きさで表示したいよね?

 

 

おしまい。