DirectXの前に、そもそもWindows上で動くプログラムの作り方を学ばなければならない。
「ファイル」⇒「新規作成」⇒「プロジェクト」を選択し「VisualC++」⇒「空のプロジェクト」を選ぶ
現在のPCはほとんどが64ビットだと思うので、それに合わせて設定しておく。
「Main.cpp」を作成し、ソリューションエクスプローラでプロジェクト名(太字部分)を右クリックし、プロパティを選択。
続けて次のように設定。
これをやらないと、作った作品がVisualStudioがインストールされていないPCで実行できなかったりする。
上と同じプロパティ画面で、左上の【構成】を「すべての構成」に切り替え、下図の項目を「Windows」にする。
これで、Windowsプログラムとして実行されるプログラムになる。
//インクルード
#include <Windows.h>
//エントリーポイント
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
return 0;
}
実行(F5)すると・・・何も起こらない。
基本的なWindowsプログラム(ウィンドウを表示するプログラム)の流れは
ウィンドウクラスという設計図を作成する
ウィンドウを作る
ウィンドウを表示する
何か起きるのを待つ
という手順になる。
そして、何かが起きると「ウィンドウプロシージャ」という関数が呼ばれる。
まずは、コメントだけ書いておこう。
//エントリーポイント
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
//ウィンドウクラス(設計図)を作成
//ウィンドウを作成
//ウィンドウを表示
//メッセージループ(何か起きるのを待つ)
return 0;
}
//ウィンドウプロシージャ(何かあった時によばれる関数)
今からウィンドウを作るわけだが、ウィンドウ上で何かあったときに呼ばれる関数
「ウィンドウプロシージャ」を作っておく。
#include <Windows.h>
//プロトタイプ宣言
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
//エントリーポイント
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
:
:
:
}
//ウィンドウプロシージャ(何かあった時によばれる関数)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0); //プログラム終了
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
第2引数のmsgにメッセージ(何が起きたか)が入っている。
ウィンドウの×ボタンが押された(WM_DESTROY)場合はプログラムを終了。
それ以外の場合はDefWindowProcに処理を任せている。
ウィンドウクラスは「WNDCLASSEX構造体」を用意し、RegisterClassEx関数を呼ぶことで作成できる。
//ウィンドウクラス(設計図)を作成
WNDCLASSEX wc;
RegisterClassEx(&wc); //クラスを登録
構造体の各メンバに、情報を渡してやればよい。
//ウィンドウクラス(設計図)を作成
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX); //この構造体のサイズ
wc.hInstance = hInstance; //インスタンスハンドル
wc.lpszClassName = "SampleGame"; //ウィンドウクラス名
wc.lpfnWndProc = WndProc; //ウィンドウプロシージャ
wc.style = CS_VREDRAW | CS_HREDRAW; //スタイル(デフォルト)
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //アイコン
wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO); //小さいアイコン
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //マウスカーソル
wc.lpszMenuName = NULL; //メニュー(なし)
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景(白)
RegisterClassEx(&wc); //クラスを登録
先ほど作ったウィンドウクラスをもとに、ウィンドウを作成する。
ウィンドウを作成するのは「CreateWindow」関数。
//ウィンドウを作成
HWND hWnd = CreateWindow(
"SampleGame", //ウィンドウクラス名
"サンプルゲーム", //タイトルバーに表示する内容
WS_OVERLAPPEDWINDOW, //スタイル(普通のウィンドウ)
CW_USEDEFAULT, //表示位置左(おまかせ)
CW_USEDEFAULT, //表示位置上(おまかせ)
800, //ウィンドウ幅
600, //ウィンドウ高さ
NULL, //親ウインドウ(なし)
NULL, //メニュー(なし)
hInstance, //インスタンス
NULL //パラメータ(なし)
);
完成したウィンドウをディスプレイに表示する。
//ウィンドウを表示
ShowWindow(hWnd, nCmdShow);
実行すると、一瞬だけウィンドウが表示される。
ウィンドウを表示したら、何かが起きるまで待つ。
この処理をメッセージループという。
//メッセージループ(何か起きるのを待つ)
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
//メッセージあり
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//メッセージなし
else
{
//ゲームの処理
}
}
何かが起きたら先ほど作ったウィンドウプロシージャを呼ぶ。
何も無ければゲームの処理を実行する。(今は何もしてない)
ここまでできたら実行(F5)してみよう。
白いウィンドウが表示されるはず。
これがWindowsプログラムの基本となる。