その多くはちょっとしたことで解決できるものです。 しかし初心者の方は、その「ちょっとしたこと」になかなか気が付きません。
ここでは、VC++6.0でのリソースの作り方について解説します。
「新規メニュー」ボタンを押します。(左から2番目) このボタンが表示されていない人はメニューの「ツール」「カスタマイズ」 で「カスタマイズ」ダイアログを出します。「ツールバー」タグを選択して 「リソース」にチェックをつけてください。
リソース・エディタの何も表示されていない部分で右クリックして
「プロパティ」を選択してください。
IDに「"MYMENU"」のようにメニューの名前をダブルクォーテーションで くくって記入してください。ダブルクォーテーションでくくらないと MYMEUが単なる数値として取り扱われます。
また、左上の「押しピン」アイコンを押し込んでおくと、このダイアログが ずっと出ているので便利です。
リソース・エディタ上でメニュー項目などをどんどん作っていきます。
この時メニューバーに表示される項目は自動的に「ポップアップ」
にチェックがついていてIDを入力できなくなっています。
これは、その下にサブ項目が出てくることを意味します。 左の例では「ファイル」にはIDはありませんが、「終了」には 適当なID(IDM_ENDなど)をつけます。これはダプルクォーテーションで くくってはいけません。
これで、メニューアイテム「終了」の設定が終わりました。
ショートカットキー(メニュー項目の後ろについているF,V,Eなどのアンダスコア
付き文字)をつけたいときはその文字の前に「&」を付けます。
次にメニューの「ファイル」「名前をつけて保存」で****.rcで保存します。
(拡張子は付けなくても自動的に付けてくれます。ファイル名は何でもいいのですが
プロジェクト名と同じにしておくと便利です)
「プロジェクト」「プロジェクトへ追加」「ファイル」を選択します。
先ほどの****.rcを選択してリソース・スクリプトをプロジェクトに参加させます。
さて、これだけではシンボル値(IDM_ENDなど)がわかりません。しかし 自分でヘッダファイルを作る必要はありません。ソースファイルに
#include "resource.h"
の1行を加えてください。
「ファイル・ビュー」で先ほどの****.rcがプロジェクトに加わっているか 確認します。また、新たに「リソース・ビュー」のタブが加わったか 確認します。
「シンボル・ブラウザ」(一番上の図の「ID=」と書いてあるボタン)ボタンを押します。
「IDM_END」にきちんと値が割り当てられていることがわかります。
次にウィンドウクラス構造体に"MYMENU"を登録します。
もし、メニューのIDをダブルクォーテーションで囲まなかった場合は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 = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "MYMENU"; //メニュー名 wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); return (RegisterClassEx(&wc)); }
wc.lpszMenuName = MAKEINTRESOURCE(MYMENU);
としてください。ダブルクォーテーションで囲まなかった場合 シンボルブラウザで見ると「MYMENU」にも値が定義されていることがわかります。
さて、これでビルドするとメニュー付きのウィンドウが出来上がります。 しかし、これはメニューがついているだけで「終了」を選択しても 何も起こりません。メニューの「IDM_END」が選択されても プログラムには何も記載がないので、何も起こらないのです。
メニューからメニュー項目が選択されたらそのメニューを 持っているウィンドウのプロシージャにWM_COMMANDメッセージが 送られます。このメッセージを捕まえただけでは、メニューのどの項目が 選択されたかわかりません。これを調べるにはWPARAMの 下位WORD値を調べます。
そして、そこに自分が意図した処理を書き込みます。
さて、あとはビルドボタンを押せばめでたく完成です。//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; switch (msg) { case WM_COMMAND: switch (LOWORD(wp)) { case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); 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; }
サンプルのリソース・スクリプトして次のようなものが あったとします。
|
これにサンプルと同じ内容を打ち込み、 さらに、シンボル値定義のヘッダファイル"sample.h"(名前は何でもよい がプロジェクト名と同じにしておくと便利)とwindows.hを#includeします。
sample.rcと名前を付けで保存します(名前は何でもよい)。
|
「テキストファイルの新規作成」ボタンを押して sample.hを作り、保存します。
|
sample.rcをプロジェクトに参加させます。
ソース・ファイルにはresource.hではなくsample.hをインクルードします。 あとは、ビルドすれば終わりです。
このようにして 作ったリソースはリソース・エディタで編集するとおかしくなります。 最後まで、手書きでリソース・スクリプトを編集する必要があります。 うっかり「ファイル」「開く」でsample.rcを開くとリソース・エディタが 立ち上がり、sample.rcが改変されます。これを防ぐには、「ファイル」「開く」 のダイアログのとき「用途」を「自動」ではなく「テキスト」に しておくとテキストファイルとして開くことができます。
そして、プロジェクトを作りなおします。プロジェクト名を前回と同じにしておきます。 これが一番手っ取り早いです。
そのためには、リソース・スクリプトを見てどのようなリソースが 作られるのかを理解する必要があります。(ワンパターンなのでそれほど難しくは ありません)
Update 12/Sep/1999 By Y.Kumei