====== 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 | 出来事に応じた処理 | 郵便に返事する係 |