ウィンドウの作成
次にウィンドウの作成をおこなっていきます。
ウィンドウは基本的にWin32APIの処理で作成します。
又、ウィンドウは拡張やスタイル(最大化、最小化、サイズ変更の有無)等の様々な設定が可能になっているので目的に応じて自由にカスタマイズすることができます。
今回は一般的な設定のWS_OVERLAPPEDWINDOWを使用します。
// Win32APIの機能を使用するためにinclude(main.cppにwindows.hを含めるように)します。
#include <windows.h>
// ウインドウプロシージャー
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
switch( uiMsg )
{
case WM_CLOSE: // 閉じる際にWindowを破棄する
DestroyWindow(hWnd);
return 0;
case WM_DESTROY: // プログラムの終了を通知する
PostQuitMessage(0);
return 0L;
}
// 既定のウィンドウプロシージャを呼び出す
return DefWindowProc(hWnd, uiMsg, wParam, lParam);
}
// エントリーポイント
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// ウィンドウ位置・サイズの設定
int x = 0;
int y = 0;
int width = 640;
int height = 480;
// ウィンドウ名の設定
const TCHAR* pWindowName = TEXT("DirectX9");
WNDCLASSEX wcex;
// ウインドウの設定
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = GetModuleHandle(NULL);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = TEXT("DirectX9 Sample");
wcex.hIcon = LoadIcon(NULL, IDC_ARROW);
wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassExW(&wcex);
DWORD dwStyle = WS_OVERLAPPEDWINDOW;
RECT Rect;
Rect.left = 0;
Rect.top = 0;
Rect.right = width;
Rect.bottom = height;
// ウィンドウのスタイルに合わせた適切なサイズを取得する
AdjustWindowRect(&Rect, dwStyle, false);
width = Rect.right - Rect.left;
height = Rect.bottom - Rect.top;
// ウインドウの生成
HWND hWnd = CreateWindow(wcex.lpszClassName,
pWindowName,
dwStyle,
x,
y,
width,
height,
NULL,
NULL,
GetModuleHandle(NULL),
NULL);
if( hWnd == NULL )
{
return false;
}
// ウインドウの表示
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
MSG msg;
// メインループ
while( true )
{
// メッセージが存在するか確認
if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
// 終了通知が来ている場合は抜ける
if( msg.message == WM_QUIT )
{
break;
}
// メッセージをウインドウプロシージャに転送
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
たったこれだけのプログラムでウィンドウの作成が出来てしまいます。
設定や決まりごとが多くて最初は難しいと感じると思いますが、何度も使う処理なので繰り返しているうちに分かるようになってくるはずです。
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
ウィンドウプロシージャと書いている部分がありますが、これはウィンドウに対して通知されるメッセージを処理するための関数です。
通知されるメッセージとはキー入力や最小化、最大化、閉じる等の様々なものがあります。
最初から全てを理解する必要はないので、こうやってウィンドウが作成されているだなと雰囲気だけでも感じでもらえればいいかと思います。
上のプログラムの実行結果はこんな感じです。
まだウィンドウを作っただけなので真っ暗な画面のウィンドウが出来上がりました。
PC上のゲームもこうやって作ったウィンドウの上で動作するようになっています。
なのでここまでやった方はゲームプログラムの一端に触れたということですね。
