カスタムリソース
ユーザー定義リソース
一般的なリソース以外に、アプリケーション独自のデータ型をリソースにしたい場合もあります
そのような場合は、ユーザー定義リソースという方法を用いることができます
これは、アプリケーション独自のカスタムリソースを使うことができるようになります
ユーザー定義リソースのデータ型は自由です
データ名は、テキストでもかまいませんし整数でもかまいません
この仕様は 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