カスタムリソース


ユーザー定義リソース

一般的なリソース以外に、アプリケーション独自のデータ型をリソースにしたい場合もあります
そのような場合は、ユーザー定義リソースという方法を用いることができます
これは、アプリケーション独自のカスタムリソースを使うことができるようになります

ユーザー定義リソースのデータ型は自由です
データ名は、テキストでもかまいませんし整数でもかまいません
この仕様は ICON 文の識別子の仕様と同じなので理解できると思います

nameID datatype filename

nameID には識別子、datatype にはデータ名
filename には、リソースにするファイル名を指定します

この独自のリソースをプログラムにロードするには LoadResource() を使います

HGLOBAL LoadResource(HMODULE hModule , HRSRC hResInfo);

hModule には、リソースの入ったモジュールのハンドルを指定します
HMODULE という型になっていますがインスタンスハンドルも指定できます
hResInfo にはロードするリソースの情報のハンドルを指定します

hResInfo に渡す情報は FindResource() ファンクションの戻り値です

HRSRC FindResource(HMODULE hModule , LPCTSTR lpName , LPCTSTR lpType);

hModule には、リソースが入ったモジュールのハンドルを
lpName には、リソースの識別子を、lpType にはリソースの型を指定します
戻り値は情報ブロックのハンドルになりますが、失敗すれば NULL が返ります

LoadResource() が返した HGLOBAL 型の変数からデータを使用するには
LockResource() 関数を使ってメモリへのポインタを取得します

LPVOID LockResource(HGLOBAL hResData);

hResData には、LoadResource() が返したロックするリソース指定します
この関数はリソースをメモリにロードし、リソースの最初のバイトへのポインタを返します
このポインタから、リソースの様々な位置へアクセスしてデータを得ることができます

Win32 では、これらの関数でロードしたりソースを解放する必要はありません
しかし、Win16 のころは FreeResource() という関数で解放していました

以下のプログラムでは RECT という型のリソースを読みこみます
RECT 型のデータは、4バイトのファイルでそれぞれ矩形の座標を示します
リソースとして test.rec というファイルを埋めこみます
このファイルには、バイナリで 0A 0A 64 64 (16進数)というデータが格納されているとします
/*リソーススクリプト*/
DRAW_RECT	RECT	"test.rec"
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	PAINTSTRUCT ps;
	HDC hdc;
	HGLOBAL hGM;
	static char *rect;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		hGM = LoadResource(((LPCREATESTRUCT)(lp))->hInstance ,
			FindResource(((LPCREATESTRUCT)(lp))->hInstance ,
				 TEXT("DRAW_RECT") , TEXT("RECT")
			)
		);
		rect = (char *)LockResource(hGM);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);
		Rectangle(hdc , *rect , *(rect + 1) , *(rect + 2) , *(rect + 3));
		EndPaint(hwnd , &ps);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
左上座標 10 , 10、右下座標 100 , 100 ピクセルに長方形を描画します
このプログラムは、リソースファイルを変更するだけで
描画する長方形の大きさや位置を変更することができます


LoadResource()

HGLOBAL LoadResource(HMODULE hModule , HRSRC hResInfo);

リソースをグローバルメモリに読みこみます

hModule - リソースが入ったモジュールのハンドルを指定します
hResInfo - リソースの情報ブロックのハンドルを指定します

戻り値 - 成功するとグローバルメモリブロックのハンドル。失敗すると NULL

FindResource()

HRSRC FindResource(HMODULE hModule , LPCTSTR lpName , LPCTSTR lpType);

指定されたりソースモジュールから
指定されたデータ型と識別子を持つリソースの情報ブロックのハンドルを取得します

hModule - リソースが入っているモジュールのハンドルを指定します
lpName - リソース識別子を指定します
lpType - リソースのデータ型を指定します

戻り値 - 情報ブロックのハンドル。失敗すると NULL

lpType には、以下の標準リソースタイプを指定することもできます

定数解説
RT_ACCELERATOR アクセラレータテーブル
RT_ANICURSOR アニメーションカーソル
RT_ANIICON アニメーションアイコン
RT_BITMAP ビットマップリソース
RT_CURSOR ハードウェア依存のカーソルリソース
RT_DIALOG ダイアログボックス
RT_FONT フォントリソース
RT_FONTDIR フォントディレクトリリソース
RT_GROUP_CURSOR ハードウェア独立のカーソルリソース
RT_GROUP_ICON ハードウェア独立のアイコンリソース
RT_ICON ハードウェア依存のアイコンリソース
RT_MENU メニューリソース
RT_MESSAGETABLE メッセージテーブルエントリ
RT_RCDATA アプリケーション定義のリソース
RT_STRING 文字列テーブルエントリ
RT_VERSION バージョンリソース

LockResource()

LPVOID LockResource(HGLOBAL hResData);

メモリ内の指定リソースをロックします

hResData - ロックするリソースを指定します

戻り値 - ロックされたときは、リソースの最初のバイトへのポインタ。それ以外は NULL



前のページへ戻る次のページへ