CreateWindowEx()でウィンドウの作成

本連載では、Windows APIを使ったウィンドウプログラミングの学習を進めるためにMicrosoftの次の チュートリアルに沿って演習を進めている。

Module 1. Your First Windows Program - Win32 apps | Microsoft Docs

前回はCreateWindowEx()関数でウィンドウを作成する方法を学習した。CreateWindowEx()関数でウィンドウの座標やウィンドウ名、最大化や最小化といったタイトルバーのアイコン、ボーダーラインやサイズ変更、スクロールバーなどの指定を行うことができることを確認した。

前回使ったソースコードは次のとおり。

winmain.c

/*

* Reference:

* https://docs.microsoft.com/en-us/windows/win32/learnwin32/your-first-windows-program

* https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassa

*/

#ifndef UNICODE

#define UNICODE

#endif

#include

#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOW + 1)

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

/*

* ウィンドウプログラムエントリポイント関数

*/

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)

{

// ウィンドウクラス名

const wchar_t CLASS_NAME[] = L"ウィンドウ作成の学習用プログラムクラス";

// ウィンドウタイトル

const wchar_t WINDOW_TITLE[] = L"ウィンドウプログラミング学習";

// ウィンドウクラス構造体を用意

WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = WindowProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = NULL;

wc.lpszMenuName = NULL;

wc.lpszClassName = CLASS_NAME;

// style ウィンドウクラススタイル

// lpfnWndProc ウィンドウプロシージャ

// cbClsExtra クラス構造体以降の追加確保分指定

// cbWndExtra ウィンドウインスタンス以降の追加確保分指定

// hInstance ウィンドウプロシージャインスタンス

// hIcon クラスアイコンハンドラ

// hCursor クラスカーソルハンドラ

// hbrBackground ウィンドウ背景色

// lpszMenuName クラスメニューのリソース名

// lpszClassName ウィンドウクラス名

// ウィンドウクラス構造体を登録

RegisterClass(&wc);

// ウィンドウを作成

HWND hwnd = CreateWindowEx(

0, // 拡張ウィンドウスタイル

CLASS_NAME, // ウィンドウクラス名

WINDOW_TITLE, // ウィンドウタイトル

WS_OVERLAPPEDWINDOW, // ウィンドウスタイル

// サイズとポジション

CW_USEDEFAULT, // X座標

CW_USEDEFAULT, // Y座標

1200, // 幅

800, // 高さ

NULL, // 親ウィンドウハンドラ

NULL, // メニューハンドラ

hInstance, // インスタンスハンドラ

NULL // 追加のアプリケーションデータ

);

if (hwnd == NULL)

{

return 0;

}

// ウィンドウを表示

ShowWindow(hwnd, nCmdShow);

// メッセージループを実行

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return 0;

}

/*

* ウィンドウプロシージャ関数

*/

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch (uMsg)

{

case WM_PAINT:

{

PAINTSTRUCT ps;

HDC hdc = BeginPaint(hwnd, &ps);

FillRect(hdc, &ps.rcPaint, BACKGROUND_COLOR);

EndPaint(hwnd, &ps);

}

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

このソースコードをビルドするためのnmake用Makefileは次のとおり。

Makefile

CMD= winmain

CC= cl.exe

CFLAGS= /c /source-charset:utf-8

LINK= link.exe

LIBS= user32.lib

LFLAGS=

EXIST= cmd.exe /C if exist

all: build

build: $(CMD).exe

$(CMD).exe: $(CMD).obj

$(LINK) $(LFLAGS) $(LIBS) *.obj

dir

.c.o:

$(CC) $(CFLAGS) $*.c

run: build

$(CMD).exe

clean:

$(EXIST) $(CMD).obj del *.obj

$(EXIST) $(CMD).exe del $(CMD).exe

dir

corruption-run: clean

$(CC) /c $(CMD).c

$(LINK) $(LFLAGS) $(LIBS) *.obj

$(CMD).exe

サンプルソースコードでは、CreateWindowEx()関数を呼び出してウィンドウを作成したあとでShowWindow()関数を呼び出すことでウィンドウを表示している。この後でサンプルソースコードはメッセージループという処理に入る。今回はこの部分でいったい何が行われているのか調べていく。



メッセージループ

ShowWindow()関数を呼び出してウィンドウを表示した後で、アプリケーションの処理は次のループ処理に入る。

メッセージループ

// メッセージループを実行

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

この部分は、とりあえずこう書く仕組みになっているものだと思っておいてよいだろう。GetMessage()でイベント待ちをし、イベントが発生したらTranslateMessage()とDispatchMessage()をコールする。

今回は、このメッセージループと、前回も取り上げたウィンドウプロシージャの関係を調べてみよう。どちらもイベントが発生すると動く仕組みになっており、どのような関係性にあるのかを把握しておきたいのだ。

メッセージループでは、MSG構造体の変数に発生したイベント情報が収められていることがわかる。MSG構造体は次のような構造体だ。

MSG構造体

typedef struct tagMSG {

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

DWORD lPrivate;

} MSG, *PMSG, *NPMSG, *LPMSG;

MSG構造体の主なメンバは次のとおり。

MSG構造体のmessageメンバに発生したイベント(メッセージ)の識別子(番号)が格納されている。このメッセージはウィンドウプロシージャでも使われているようなので、これをトレースすることでお互いどんなタイミングでイベントが発生しているのかを調べてみよう。

なお、MSG構造体、GetMessage()関数、TranslateMessage()関数、DispatchMessage()関数については次のページに説明がまとまっている。

MSG (winuser.h) - Win32 apps | Microsoft Docs

GetMessage function (winuser.h) - Win32 apps | Microsoft Docs

TranslateMessage function (winuser.h) - Win32 apps | Microsoft Docs

DispatchMessage function (winuser.h) - Win32 apps | Microsoft Docs

メッセージをログファイルに記録する

そこで、どのようなメッセージが飛んできているのかについて、ファイルを記録して確認することにする。次の関数Log_uMsg()は指定したファイルに指定したメッセージ(UNIT)を記録するものだ。今回、この関数の説明は省略するが、ファイルに記録するものと考えていただければと思う。

Log_uMsg()関数

/*

* MSG.messageを指定したファイルへ追記する関数

*/

void Log_uMsg(LPCWSTR fPath, UINT uMsg)

{

HANDLE hFile;

hFile = CreateFile(

fPath, GENERIC_WRITE, 0, NULL,

OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL

);

SetFilePointer(hFile, 0, NULL, FILE_END);

TCHAR buf[1024];

wsprintf(buf, TEXT("message: %d\n"), uMsg);

DWORD dwNoW = 0;

WriteFile(hFile, buf, lstrlen(buf)*sizeof(TCHAR), &dwNoW, NULL);

CloseHandle(hFile);

}

この記録用の関数をメッセージループとウィンドウプロシージャの双方に仕込む。次のような感じでLog_uMsg()関数を挟んでおけばよい。

メッセージループにLog_uMsg()を仕込む

// メッセージループを実行

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

Log_uMsg(TEXT("log1.txt"), msg.message);

TranslateMessage(&msg);

DispatchMessage(&msg);

}

ウィンドウプロシージャにLog_uMsg()を仕込む

/*

* ウィンドウプロシージャ関数

*/

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

Log_uMsg(TEXT("log2.txt"), uMsg);

switch (uMsg)

{

これらコードをwinmain.cにマージして動作する状態にまとめると次のようになる。

winmain.c

/*

* Reference:

* https://docs.microsoft.com/en-us/windows/win32/learnwin32/your-first-windows-program

* https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassa

*/

#ifndef UNICODE

#define UNICODE

#endif

#include

#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOW + 1)

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

void Log_uMsg(LPCWSTR fPath, UINT uMsg);

/*

* ウィンドウプログラムエントリポイント関数

*/

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)

{

// ウィンドウクラス名

const wchar_t CLASS_NAME[] = L"ウィンドウ作成の学習用プログラムクラス";

// ウィンドウタイトル

const wchar_t WINDOW_TITLE[] = L"ウィンドウプログラミング学習";

// ウィンドウクラス構造体を用意

WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = WindowProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = NULL;

wc.lpszMenuName = NULL;

wc.lpszClassName = CLASS_NAME;

// style ウィンドウクラススタイル

// lpfnWndProc ウィンドウプロシージャ

// cbClsExtra クラス構造体以降の追加確保分指定

// cbWndExtra ウィンドウインスタンス以降の追加確保分指定

// hInstance ウィンドウプロシージャインスタンス

// hIcon クラスアイコンハンドラ

// hCursor クラスカーソルハンドラ

// hbrBackground ウィンドウ背景色

// lpszMenuName クラスメニューのリソース名

// lpszClassName ウィンドウクラス名

// ウィンドウクラス構造体を登録

RegisterClass(&wc);

// ウィンドウを作成

HWND hwnd = CreateWindowEx(

0, // 拡張ウィンドウスタイル

CLASS_NAME, // ウィンドウクラス名

WINDOW_TITLE, // ウィンドウタイトル

WS_OVERLAPPEDWINDOW, // ウィンドウスタイル

// サイズとポジション

CW_USEDEFAULT, // X座標

CW_USEDEFAULT, // Y座標

1200, // 幅

800, // 高さ

NULL, // 親ウィンドウハンドラ

NULL, // メニューハンドラ

hInstance, // インスタンスハンドラ

NULL // 追加のアプリケーションデータ

);

if (hwnd == NULL)

{

return 0;

}

// ウィンドウを表示

ShowWindow(hwnd, nCmdShow);

// メッセージループを実行

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

Log_uMsg(TEXT("log1.txt"), msg.message);

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return 0;

}

/*

* ウィンドウプロシージャ関数

*/

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

Log_uMsg(TEXT("log2.txt"), uMsg);

switch (uMsg)

{

case WM_PAINT:

{

PAINTSTRUCT ps;

HDC hdc = BeginPaint(hwnd, &ps);

FillRect(hdc, &ps.rcPaint, BACKGROUND_COLOR);

EndPaint(hwnd, &ps);

}

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

/*

* MSG.messageを指定したファイルへ追記する関数

*/

void Log_uMsg(LPCWSTR fPath, UINT uMsg)

{

HANDLE hFile;

hFile = CreateFile(

fPath, GENERIC_WRITE, 0, NULL,

OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL

);

SetFilePointer(hFile, 0, NULL, FILE_END);

TCHAR buf[1024];

wsprintf(buf, TEXT("message: %d\n"), uMsg);

DWORD dwNoW = 0;

WriteFile(hFile, buf, lstrlen(buf)*sizeof(TCHAR), &dwNoW, NULL);

CloseHandle(hFile);

}

ではこのコードを実行してみよう。



実際に動かして動作を確認する

書き換えたwinmain.cをコンパイルして実行する。

起動したらすぐに終了しても大丈夫だ。それだけで十分な数のメッセージが取得できている。ここでそれぞれ取得されたログデータは次のとおり。

長くなるが、比較を行いたいのでそれぞれ記録されたデータの全容を記載しておく。

log1.txtのサンプル

message: 799

message: 49336

message: 512

message: 96

message: 15

message: 96

message: 49246

message: 49246

message: 96

message: 275

message: 275

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 161

message: 799

message: 49336

message: 15

message: 96

message: 96

message: 96

message: 49246

message: 49246

message: 96

message: 96

message: 96

message: 96

message: 257

message: 96

message: 275

message: 275

message: 96

message: 96

message: 275

message: 275

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 160

message: 160

message: 160

message: 674

message: 160

message: 160

message: 160

message: 160

message: 160

message: 512

message: 674

message: 512

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 161

message: 160

message: 160

message: 512

message: 674

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 96

message: 96

message: 275

message: 275

message: 160

message: 512

message: 674

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 513

message: 96

message: 96

message: 49246

message: 49246

message: 512

message: 96

message: 275

message: 514

message: 275

message: 96

message: 256

message: 256

message: 96

message: 512

message: 512

message: 96

message: 257

message: 96

message: 96

message: 257

message: 96

message: 96

message: 257

message: 96

message: 512

message: 96

message: 96

message: 275

message: 275

message: 96

message: 96

message: 49246

message: 96

message: 49246

message: 96

message: 512

message: 275

message: 512

message: 512

message: 275

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 96

message: 96

message: 275

message: 275

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 160

message: 160

message: 160

message: 674

message: 49681

message: 49681

message: 49681

message: 160

message: 512

message: 674

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 513

message: 96

message: 96

message: 49246

message: 49246

message: 512

message: 96

message: 512

message: 275

message: 514

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 275

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 512

message: 160

message: 512

message: 674

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 160

message: 161

log2.txtのサンプル

message: 36

message: 129

message: 131

message: 1

message: 24

message: 70

message: 70

message: 28

message: 134

message: 127

message: 127

message: 127

message: 6

message: 641

message: 642

message: 7

message: 133

message: 20

message: 71

message: 5

message: 3

message: 127

message: 799

message: 127

message: 49336

message: 36

message: 132

message: 32

message: 512

message: 127

message: 15

message: 49230

message: 648

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 161

message: 533

message: 174

message: 274

message: 16

message: 144

message: 70

message: 71

message: 134

message: 6

message: 28

message: 8

message: 641

message: 642

message: 2

message: 130

message: 36

message: 129

message: 131

message: 1

message: 24

message: 70

message: 70

message: 28

message: 134

message: 127

message: 127

message: 127

message: 6

message: 641

message: 642

message: 7

message: 133

message: 20

message: 71

message: 5

message: 3

message: 127

message: 799

message: 49336

message: 36

message: 127

message: 15

message: 127

message: 49230

message: 648

message: 257

message: 134

message: 6

message: 28

message: 8

message: 641

message: 642

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 32

message: 160

message: 32

message: 160

message: 132

message: 32

message: 174

message: 160

message: 674

message: 132

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 132

message: 32

message: 512

message: 674

message: 132

message: 32

message: 512

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 33

message: 32

message: 161

message: 70

message: 71

message: 28

message: 134

message: 6

message: 641

message: 642

message: 7

message: 274

message: 533

message: 36

message: 561

message: 674

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 534

message: 70

message: 36

message: 71

message: 3

message: 533

message: 70

message: 562

message: 32

message: 160

message: 32

message: 160

message: 132

message: 32

message: 512

message: 674

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 134

message: 6

message: 28

message: 8

message: 641

message: 642

message: 132

message: 32

message: 160

message: 132

message: 32

message: 512

message: 674

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 33

message: 70

message: 71

message: 28

message: 134

message: 6

message: 641

message: 642

message: 7

message: 32

message: 513

message: 132

message: 32

message: 512

message: 132

message: 32

message: 514

message: 256

message: 256

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 257

message: 257

message: 257

message: 132

message: 32

message: 512

message: 134

message: 6

message: 28

message: 8

message: 641

message: 642

message: 70

message: 28

message: 134

message: 6

message: 641

message: 642

message: 7

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 134

message: 6

message: 28

message: 8

message: 641

message: 642

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 160

message: 132

message: 32

message: 160

message: 132

message: 32

message: 160

message: 674

message: 49681

message: 132

message: 32

message: 160

message: 132

message: 32

message: 512

message: 674

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 33

message: 70

message: 71

message: 28

message: 134

message: 6

message: 641

message: 642

message: 7

message: 32

message: 513

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 514

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 512

message: 132

message: 32

message: 160

message: 132

message: 32

message: 512

message: 674

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 160

message: 32

message: 161

message: 533

message: 274

message: 16

message: 144

message: 70

message: 71

message: 134

message: 6

message: 28

message: 8

message: 641

message: 642

message: 2

message: 130

ここからわかるように、メッセージループからウィンドウプロシージャが呼ばれるというよりも、メッセージループもウィンドウプロシージャもそれぞれの仕組みに従ってイベントがファイアしている動きをしていることがわかる。似たような動きに見えるが、実際には異なるものとして扱った方が適切ということになりそうだ。

実際に動かして理解していくことが大切

Windows APIで提供されている構造体や関数は、Microsoft Docsにドキュメントがまとまっている。サンプルコードも多く掲載されているので、Windows APIの全体像は比較的つかみやすいだろう。

しかしながら、実際にどのように動作するかは自分で作って実際に試してみるのがお薦めだ。ドキュメントを読んだだけの理解では、自分の都合がよいように解釈していることがある。往々にして人間は自分にとって都合がよいように理解しがちなのだ。こんな感じで自分で動きを追ってみると、APIの全体像や構造がよく見えてくる。ぜひとも実際に試して動きを追ってみてもらえればと思う。

○参考

Module 1. Your First Windows Program - Win32 apps | Microsoft Docs

WNDCLASSA (winuser.h) - Win32 apps | Microsoft Docs

Window Class Styles (Winuser.h) - Win32 apps | Microsoft Docs

LoadCursorA function (winuser.h) - Win32 apps | Microsoft Docs

GetSysColor function (winuser.h) - Win32 apps | Microsoft Docs

Window Styles (Winuser.h) - Win32 apps | Microsoft Docs