2025/6/6 作成
ウィンドウの表示の解説
前回はプロジェクトを作成してウィンドウを表示するところまでやりました。ウィンドウの表示のコードの説明をちゃんとしていなかったのでしていこうと思います。
前回はプロジェクトを作成して次のコードを書きました。
#include <windows.h>
const int WIDTH = 800;
const int HEIGHT = 600;
const wchar_t TITLE[] = L"ウィンドウの表示";
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI wWinMain(_In_ HINSTANCE hInst, _In_opt_ HINSTANCE hPrev, _In_ PWSTR pCmd, _In_ int nCmd)
{
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInst;
wc.lpszClassName = L"Window Class";
RegisterClass(&wc);
RECT rc = { 0, 0, WIDTH, HEIGHT };
AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
HWND hwnd = CreateWindowEx(0, wc.lpszClassName, TITLE,
WS_OVERLAPPEDWINDOW ^ WS_SIZEBOX ^ WS_MAXIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top,
NULL, NULL, hInst, NULL);
if (hwnd == NULL) return 0;
ShowWindow(hwnd, nCmd);
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
このコードを理解するには、一文ずつの解説が必要です。長くなりますが、どうぞお付き合いください。
#include <windows.h>というのは、windows.hというヘッダーファイルを読み込むというものです。ヘッダーファイルにはウィンドウを扱うための機能がたくさん入っているものです。これを使うことによりウィンドウの表示ができるのです。
const int WIDTH = 800では、int型のWIDTHという変数を定義しています。constはプログラム中変更できない定数を扱うもので、intは整数を入れるための箱を用意するものです。=の右の値をWIDTHに入れるという処理をしています。この変数はウィンドウの幅で使い、途中で変更しないので定数として定義しているのです。同じくHEIGHTにウィンドウの高さを入れています。
const wchar_t TITLE[] = L"ウィンドウの表示"では、TITLE配列にワイド文字列を入れるという処理をしています。wchar_tというのはワイド文字列を扱う型です。ワイド文字列というのは、ここではUTF-8のことを指しています。これはWindowsで使われている一般的なものであり、charを使ったASCIIコードとは区別されます。charとwchar_tどちらを使うか迷ったらwchar_tが多くの文字を扱えるのでおすすめです。TITLE[]というのはTITLEという配列を扱うものです。L"(文字)"と書くことで、ワイド文字列を扱うことができます。通常の"(文字)"はANSI文字列となります。
上にあるLRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)というのは、WindowProcという関数を宣言するものです。実際に定義しているのは下のほうにあるWindowProc関数になります。なぜこのような書き方をしているのかというと、WindowProc関数を事前に読み込ませたいからです。処理の順番的には、ウィンドウの表示→ウィンドウプロシージャ(WindowProc)になるのですが、ウィンドウプロシージャを宣言せずにwWinMain関数の中でウィンドウプロシージャを呼び出すとエラーになります。そのため、ウィンドウプロシージャをウィンドウの表示より前に宣言しているのです。プログラムの処理の流れとしては上から下に読み込まれることになります。なので、WindowProc関数の詳細な説明は後に回します。
・・・Commming Soon・・・