リソース

リソースとは

基本編では、簡単なウィンドウズアプリの作成の方法や、イベント処理の方法について学習しましたが、応用編では、リソースの使い方について説明します。アイコンとは、マウスのカーソルやアイコン、様々なコントローラなどといった、ウィンドウアプリの付属の部品のようなものです。第一日目では、その中で最も基本的なものである、アイコンとカーソルについて説明します。

サンプルプログラム

次のプログラムは、リソースである、マウスカーソルとアイコンを独自に作成し利用するというものです。まずは、以下のプログラムを入力してください。ただし、今回はこれで終了と言うわけではありません。プログラムの入力が完了したら、対応するリソースを作る必要があります。

win32exproj1-1:WinMain.cpp
// ************************************
// Ex ウインドウ描画の雛形
// ************************************
//必要なヘッダーファイルのインクルード
#define STRICT

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

//	リソースのインクルード
#include "resource.h"

// シンボル定義及びマクロ
#define WINDOW_WIDTH    800
#define WINDOW_HEIGHT   600

//	インスタンス(グローバル変数)
HINSTANCE hInst;

//	ウィンドウプロシージャのコールバック関数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	static TCHAR szWindowClass[] = _T("Sample01");
	static TCHAR szTitle[] = _T("リソースを使ったアプリのサンプル①");

	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
	wcex.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = szWindowClass;
	wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));

	if (!RegisterClassEx(&wcex))
	{
		MessageBox(NULL,
			_T("RegisterClassExの処理に失敗しました"),
			_T("Sample02"),
			NULL);

		return 1;
	}

	hInst = hInstance; // グローバル変数に値を入れる

	// The parameters to CreateWindow explained:
	// szWindowClass				: アプリケーションの名前
	// szTitle						: タイトルバーに現れる文字列
	// WS_OVERLAPPEDWINDOW			: 生成するウィンドウのタイプ
	// CW_USEDEFAULT, CW_USEDEFAULT	: 最初に置くポジション (x, y)
	// WINDOW_WIDTH, WINDOW_HEIGHT	: 最初のサイズ (幅, 高さ)
	// NULL							: このウィンドウの親ウィンドウのハンドル
	// NULL							: メニューバー(このサンプルでは使用せず)
	// hInstance					: WinMain関数の最初のパラメータ
	// NULL							: WM_CREATE情報(このアプリケーションでは使用せず)
	HWND hWnd = CreateWindow(
		szWindowClass,
		szTitle,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT,
		WINDOW_WIDTH, WINDOW_HEIGHT,
		NULL,
		NULL,
		hInstance,
		NULL
		);
	//	ウィンドウが生成できなかった場合
	if (!hWnd)
	{
		MessageBox(NULL,
			_T("ウィンドウ生成に失敗しました!"),
			_T("Sample01"),
			NULL);
		return 1;
	}

	// ウィンドウの表示に必要なパラメータ:
	// hWnd		: CreateWindowの戻り値
	// nCmdShow	: WinMainの引数の4番目
	ShowWindow(hWnd,
		nCmdShow);
	UpdateWindow(hWnd);

	// メインのメッセージループ:
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (int)msg.wParam;
}

//	ウィンドウプロシージャ(メッセージに対するコールバック関数)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
    //キーを押した
    case WM_KEYDOWN:
        switch(wParam)
        {
        case VK_ESCAPE:
            //終了メッセージを発生させる
            PostMessage(hWnd, WM_CLOSE, 0, 0);
            break;
        }
        return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
		break;
	}

	return 0;
}

リソースの作成

では、プログラムを実行する前に、リソースを作成しましょう。

(1) リソースの作成

まず、ソリューションエクスプローラを右クリックします。(図1-1.)

図1-1.ソリューションエクスプローラ

ソリューションエクスプローラ

出てきたダイアログの中で、「追加」→「リソースの追加」を選択します。(図1-2.)

図1-2.リソースの追加

リソースの追加

このプログラムを実行すると、「OK」ボタンのみが表示された、非常に簡素なメッセージボックスが出現します。OKボタンを押すと、メッセージボックスは消えて、プログラムは終了します。

(2) アイコンの追加

続いて、作成するアイコンの種類を選択します。ここでは、カーソルを作成します。Iconを選択し、「新規作成」ボタンを押しましょう。

図1-3.アイコンの作成

アイコンの作成

すると、アイコンの編集画面に映ります。アイコンには、小アイコン(16×16)と、大アイコン(32×32)があります。このエディターでは、それらを任意に編集することができます。(図1-4.)

図1-4.アイコン編集画面

アイコン編集画面
(3) カーソルの追加

続いて、カーソルの追加・編集をします。再びリソースを右クリックし、「追加」→「リソースの追加」を行います。(図1-5.)

図1-5.カーソルの追加

カーソルの追加

ここで、Cursorを選択し、「新規作成」ボタンを押します。すると、カーソルの編集画面にうつります。(図1-6.)

図1-6.カーソルの編集

カーソルの編集

アイコンと同様に、カーソルにもリソースのIDがあります。自動生成されるものが、IDC_CURSOR1です。この名前も、任意に変更することが可能です。

プログラムの実行

以上で、準備は完了です。プログラムを実行すると、何も表示されていないウィンドウが表示されますが、画面右上のアイコンが、作成したものと同じものになっています。(図1-7.)

図1-7.プログラム実行結果

プログラム実行結果

また、このウィンドウにマウスカーソルを乗せると、マウスが、デザインしたアイコンと同じものに変わっていることがわかります。プログラムは、右上の×をクリックするか、ESCキーを押すと終了します。

更に、このプロジェクトが入っているフォルダ内で、このプログラムの実行ファイルである「.exe」ファイルを見ると、以下のように、アイコンが作成したものと変わっていることがわかります。(図1-8.)

図1-8.アイコンの変更

アイコンの変更

プログラムの仕組み

リソースのインクルード

リソースを使ったプログラムは、手始めに、リソースのインクルードをしなくてはなりません。リソースは、resource.hを読み込むことによって利用可能になります。(13行目)

リソースのインクルード
#include "resource.h"

カーソルの読み込み

続いて、カーソルの読み込みの方法について説明します。カーソルの読み込みは、LoadCursorという関数で行います。仕様は、以下のようになっています。

LoadCursor関数
HCURSOR LoadCursor(
  HINSTANCE hInstance,     // アプリケーションインスタンスのハンドル
  LPCTSTR lpCursorName   // 名前またはリソースの識別子
);

プログラムでのカーソルの読み込み処理は、42行目で行われています。サンプルから見てわかるとおり、IDC_CURSOR1という識別子のついたカーソルを読み込んでいます。

カーソルの読み出し
wcex.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));

アイコンの読み出し

アイコンの読み出しは、LoadIconという関数で行います。仕様は、以下のようになっています。

ボタンとアイコンのパラメータの指定方法の例
HICON LoadIcon(   HINSTANCE hInstance,     // アプリケーションインスタンスのハンドル   LPCTSTR lpIconName   // リソース名の文字列またはリソース識別子 );

プログラム内では、二か所でアイコンファイルをロードしています。通常アイコンのロード(41行目)と、スモールアイコンのロード(46行目)です。

通常アイコンの読み出し
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
スモールアイコンの読み出し
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));

以上により、カーソルおよびアイコンが設定できます。