meideru blog

家電メーカーで働いているmeideruのブログです。主に技術系・ガジェット系の話を書いています。

Windows API (Win32 API) の基本テンプレートを書いてみた

      2018/11/01

Windows

Windows API (Win32 API) の基本テンプレートを書きました。

使いまわせます!

ぜひ、活用してください(^^)

Windows API の基本テンプレート

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	// ウィンドウプロシージャ
ATOM InitApp(HINSTANCE);								// ウィンドウクラスの登録
BOOL InitInstance(HINSTANCE, int);						// ウィンドウの生成

// Windows プログラムのエントリーポイント
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
	LPSTR lpsCmdLine, int nCmdShow)
{
	MSG msg;
	BOOL bRet;

	// ウィンドウクラスの登録
	if (!InitApp(hCurInst)) {
		return FALSE;
	}

	// ウィンドウの生成
	if (!InitInstance(hCurInst, nCmdShow)) {
		return FALSE;
	}

	// メッセージを取得
	while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
		if (bRet == -1) {
			break;
		} else {
			TranslateMessage(&msg);		// メッセージを変換
			DispatchMessage(&msg);		// メッセージを送出
		}
	}
	return (int)msg.wParam;
}

// ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst)
{
	WNDCLASSEX wc;
	wc.cbSize = sizeof(WNDCLASSEX);			// 構造体のサイズ
	wc.style = CS_HREDRAW | CS_VREDRAW;		// クラスのスタイル
	wc.lpfnWndProc = WndProc;				// プロシージャ名
	wc.cbClsExtra = 0;						// 補助メモリ
	wc.cbWndExtra = 0;						// 補助メモリ
	wc.hInstance = hInst;					// インスタンス
	wc.hIcon = (HICON)LoadImage(			// アイコン
		NULL, MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
	wc.hCursor = (HCURSOR)LoadImage(		// カーソル
		NULL, MAKEINTRESOURCE(IDC_ARROW),
		IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
	wc.hbrBackground =						// 背景ブラシ
		(HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;					// メニュー名
	wc.lpszClassName = TEXT("Class Name");	// クラス名
	wc.hIconSm = (HICON)LoadImage(			// 小さいアイコン
		NULL, MAKEINTRESOURCE(IDI_APPLICATION),
		IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);

	return(RegisterClassEx(&wc));
}

// ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
	HWND hWnd;

	hWnd = CreateWindow(
		TEXT("Class Name"),		// クラス名
		TEXT("ウィンドウ名"),		// ウィンドウ名
		WS_OVERLAPPEDWINDOW,	// ウィンドウスタイル
		CW_USEDEFAULT,			// x位置
		CW_USEDEFAULT,			// y位置
		CW_USEDEFAULT,			// ウィンドウ幅
		CW_USEDEFAULT,			// ウィンドウ高さ
		NULL,		// 親ウィンドウのハンドル、親を作るときは NULL
		NULL,		// メニューハンドル、クラスメニューを使うときは NULL
		hInst,		// インスタンスハンドル
		NULL		// ウィンドウ作成データ
		);

	if (!hWnd) {
		return FALSE;
	}

	ShowWindow(hWnd, nCmdShow);		// ウィンドウの表示状態を設定
	UpdateWindow(hWnd);				// ウィンドウを更新

	return TRUE;
}

// ウィンドウプロシージャ(コールバック関数)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	switch (msg) {
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return(DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}

Windows API のテンプレートの解説

少しだけWindows API の関数や構造体について説明していきたいと思います。

WinMain関数について

WinMain関数は、C言語のmain関数にと同じです。最初に実行される関数です。

この関数が終了すれば、プログラムも終了です。

構造体WNDCLASSEXについて

ウィンドウの性質を格納する構造体です。

構造体のメンバに関する説明は割愛します。

RegisterClassEx関数について

ウィンドウクラスを登録する関数です。

構造体WNDCLASSEXで作ったインスタンスを引数として渡せば、ウィンドウクラスとして登録されます。

CreateWindow関数について

ウィンドウを作成する関数です。

ShowWindow関数について

ウィンドウを表示する関数です。

UpdateWindow関数について

ウィンドウを更新する関数です。

GetMessage関数について

メッセージを取得し、MSG構造体に格納する関数です。

MSG構造体はメッセージを格納する構造体です。

メッセージには、キー入力、クリックなど全てが含まれています。

WndProc関数について

メッセージを処理するための関数です。

直前に書いてある「CALLBACK」とは、コールバック関数のことで、システムから呼び出されることを意味します。

まとめ

関数や構造体についての説明は、かなりアバウトです。

Windows APIのテンプレートそのものは、ちゃんとしたコードなので、ぜひご活用ください(^_^)

 - 技術系