Windowsプログラミング入門:ウィンドウの表示方法(VS + C++ + DirectX11前段階)
はじめに
ゲームを作る前に、まずは「ウィンドウ」を表示させる必要があります。 このウィンドウは、ゲーム画面のキャンバスのようなものです。 ここでは、C++とVisual Studioを使って、Windows上にウィンドウを表示する基本的な流れを学びます。
構成の全体像
- WinMain関数:アプリの開始点
- ウィンドウクラスの登録:設計図を作る
- ウィンドウの作成:実際のウィンドウを作る
- 表示:画面に表示する
- メッセージループ:出来事を受け取り続ける
- WinProc関数:出来事(メッセージ)に応じた処理をする
WinMain関数とは?
WinMain関数は、C++のmain関数にあたるWindowsアプリのスタート地点です。
#include <windows.h> 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);
この処理で「ウィンドウの設計図(外観や動作のテンプレート)」を登録します。
ウィンドウクラス説明
ウィンドウの作成と表示
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);
メッセージループとは?
メッセージループは、ユーザー操作(クリックやキー入力など)を受け取り、処理を続ける仕組みです。
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 <windows.h> 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 | 出来事に応じた処理 | 郵便に返事する係 |