====== Windowsプログラミング入門:ウィンドウの表示方法(VS + C++ + DirectX11前段階) ======
===== はじめに =====
ゲームを作る前に、まずは「ウィンドウ」を表示させる必要があります。
このウィンドウは、ゲーム画面のキャンバスのようなものです。
ここでは、C++とVisual Studioを使って、Windows上にウィンドウを表示する基本的な流れを学びます。
===== 構成の全体像 =====
* WinMain関数:アプリの開始点
* ウィンドウクラスの登録:設計図を作る
* ウィンドウの作成:実際のウィンドウを作る
* 表示:画面に表示する
* メッセージループ:出来事を受け取り続ける
* WinProc関数:出来事(メッセージ)に応じた処理をする
===== WinMain関数とは? =====
WinMain関数は、C++のmain関数にあたるWindowsアプリのスタート地点です。
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
// ウィンドウの準備、作成、表示、メッセージ処理など
return 0;
}
* hInstance:アプリケーションのインスタンスID
* nCmdShow:ウィンドウの表示方法(最小化、通常表示など)
===== ウィンドウクラスの登録 =====
WNDCLASSEX wc = {};
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WinProc; // メッセージ処理関数
wc.hInstance = hInstance;
wc.lpszClassName = L"MyWindowClass";
RegisterClassEx(&wc);
この処理で「ウィンドウの設計図(外観や動作のテンプレート)」を登録します。\\
[[game-engineer:classes:2025:ge2-gameprograming2:wc|ウィンドウクラス説明]]
===== ウィンドウの作成と表示 =====
HWND hwnd = CreateWindowEx(
0,
L"MyWindowClass",
L"My Game Window",
WS_OVERLAPPEDWINDOW,
100, 100, 800, 600,
nullptr, nullptr,
hInstance, nullptr
);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
===== メッセージループとは? =====
[[game-engineer:classes:2025:ge2-gameprograming2:mess_loop|メッセージループ]]は、ユーザー操作(クリックやキー入力など)を受け取り、処理を続ける仕組みです。
MSG msg = {};
while (msg.message != WM_QUIT) {
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg); // WinProcへ転送
} else {
// ゲーム処理(描画や更新など)
}
}
===== WinProc関数とは? =====
WinProc関数は、ウィンドウに届いたメッセージ(通知)を処理する関数です。
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0); // 終了メッセージを送る
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
\===== よく使うメッセージ一覧 =====
^ メッセージ名 ^ 意味 ^
| WM_DESTROY | ウィンドウを閉じた |
| WM_PAINT | ウィンドウ再描画の指示 |
| WM_KEYDOWN | キー入力された |
| WM_LBUTTONDOWN | マウス左クリックされた |
\===== 全体のサンプルコード =====
#include
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0, 0, hInstance,
nullptr, nullptr, nullptr, nullptr, L"MyWindowClass", nullptr };
RegisterClassEx(&wc);
HWND hwnd = CreateWindow(L"MyWindowClass", L"My Game Window",
WS_OVERLAPPEDWINDOW, 100, 100, 800, 600, nullptr, nullptr, hInstance, nullptr);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg = {};
while (msg.message != WM_QUIT) {
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} else {
// ゲーム処理など
}
}
return 0;
}
\===== まとめ =====
^ 要素 ^ 役割 ^ イメージ ^
| WinMain | ゲームの開始点 | C++のmain関数のようなもの |
| RegisterClassEx | ウィンドウの設計図を作る | 図面を描く |
| CreateWindowEx | ウィンドウを作る | 部屋を建てる |
| ShowWindow | 表示命令 | 部屋を見せる |
| メッセージループ | 出来事の監視と処理 | 郵便の仕分け係 |
| WinProc | 出来事に応じた処理 | 郵便に返事する係 |