Windowsプログラミング入門:ウィンドウの表示方法(VS + C++ + DirectX11前段階)

はじめに

ゲームを作る前に、まずは「ウィンドウ」を表示させる必要があります。 このウィンドウは、ゲーム画面のキャンバスのようなものです。 ここでは、C++とVisual Studioを使って、Windows上にウィンドウを表示する基本的な流れを学びます。

構成の全体像

WinMain関数とは?

WinMain関数は、C++のmain関数にあたるWindowsアプリのスタート地点です。

#include <windows.h>
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
    // ウィンドウの準備、作成、表示、メッセージ処理など
    return 0;
}

ウィンドウクラスの登録

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