BCCでリソースのあるプログラムの復習です。
一番簡単なメニュー付きのプログラムをやります。
手始めにマイドキュメントのMyProjectBCCディレクトリの中にresource01というディレクトリを作ります。
ここに、resource01.cpp, resource01.rc, resource01.hファイルを作ります。さらに、Releaseというディレクトリも作っておきます。
リソース・スクリプト(resource01.rc)中のメニューは、
#include <windows.h>
#include "シンボル値定義のヘッダファイル"
メニュー名 MENU メモリオプション
{
MENUITEM "メニューアイテム" シンボルコード
}
というような感じになります。メモリオプションは無くてもかまいません。
オプションにはPRELOAD(起動時にロード), DISCARDABLE(不要になったら廃棄), FIXED(メモリ上で固定), MOVEABLE(メモリ上で移動可能)などがあります。「{」のかわりに「BEGIN」, 「}」のかわりに「END」を使っても良いです。
ポップアップメニューの場合は
メニュー名 MENU メモリオプション
{
POPUP "ポップアップアイテム1"
{
MENUITEM "メニューアイテム1",シンボルコード1
MENUITEM "メニューアイテム2",シンボルコード2
}
POPUP "ポップアップアイテム2"
{
MENUITEM "メニューアイテム3",シンボルコード3
}
}
といった感じになります。resource01.hではシンボルコードにシンボル値をdefineします。
#define シンボルコード1 シンボル値1 #define シンボルコード2 シンボル値2 .....ソース・ファイルにこのヘッダファイルをインクルードしておく必要があります。
コンパイルするには
1.カレントディレクトリをresource01に移動 2.BCC32 -W -w- -eRelease\resource01.exe resource01.cpp 3.BRC32 resource01.rc Release\resource01.exeとなります。これが面倒くさい人は、makefileを利用するか、あるいはバッチファイルを書いておいてもよいですね。もしくはBCC Developerのようなソフトを利用します。
では、簡単な例を見てみましょう。
// resource01.rc
// menu
#include <windows.h>
#include "resource01.h"
RESOURCE01 MENU PRELOAD FIXED
{
MENUITEM "アイテム1" IDM_ITEM1
MENUITEM "アイテム2" IDM_ITEM2
}
リソース・スクリプトです。
// resource.h #define IDM_ITEM1 100 #define IDM_ITEM2 101ヘッダファイルです。
// resource01.cpp
#include <windows.h>
#include "resource01.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
char szClassName[] = "resource01"; //ウィンドウクラス
char szAppName[] = "猫でもわかるリソース";
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 = "resource01"; //メニュー名
wc.lpszClassName = (LPCSTR)szClassName;
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(szClassName,
"猫でもわかるWindowsリソース", //タイトルバーにこの名前が表示されます
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)
{
int id;
switch (msg) {
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDM_ITEM1:
MessageBox(hWnd, "アイテム1が選択されました", szAppName, MB_OK);
break;
case IDM_ITEM2:
MessageBox(hWnd, "アイテム2が選択されました", szAppName, MB_OK);
break;
}
break;
case WM_CLOSE:
id = MessageBox(hWnd,
"終了してもよろしいですか",
"確認",
MB_YESNO | MB_ICONQUESTION);
if (id == IDYES)
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
うまくできたでしょうか。
メニューの「アイテム1」や「アイテム2」をクリックすると、メッセージボックスが出てきます。
Update 02/Dec/2003 By Y.Kumei