リソースがうまく表示されない時は


メニューとかダイアログボックスなどの基本的リソースの作り方についての ご質問が殺到しています。

その多くはちょっとしたことで解決できるものです。 しかし初心者の方は、その「ちょっとしたこと」になかなか気が付きません。

ここでは、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"を登録します。

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)); }

もし、メニューのIDをダブルクォーテーションで囲まなかった場合は

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; }

さて、あとはビルドボタンを押せばめでたく完成です。

HPにあるリソース・スクリプトのサンプルからリソースを作りたい

これは、どうすればよいのでしょうか。

サンプルのリソース・スクリプトして次のようなものが あったとします。

// sample.rcの一部 MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "終了(&X)...", IDM_END END END

まず、「テキストファイルの新規作成」ボタンを押します。

これにサンプルと同じ内容を打ち込み、 さらに、シンボル値定義のヘッダファイル"sample.h"(名前は何でもよい がプロジェクト名と同じにしておくと便利)とwindows.hを#includeします。

sample.rcと名前を付けで保存します(名前は何でもよい)。

// sample.rc #include <windows.h> #include "sample.h" MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "終了(&X)...", IDM_END END END

「テキストファイルの新規作成」ボタンを押して sample.hを作り、保存します。

// sample.h #define IDM_END 40002

sample.rcをプロジェクトに参加させます。

ソース・ファイルにはresource.hではなくsample.hをインクルードします。 あとは、ビルドすれば終わりです。

このようにして 作ったリソースはリソース・エディタで編集するとおかしくなります。 最後まで、手書きでリソース・スクリプトを編集する必要があります。 うっかり「ファイル」「開く」でsample.rcを開くとリソース・エディタが 立ち上がり、sample.rcが改変されます。これを防ぐには、「ファイル」「開く」 のダイアログのとき「用途」を「自動」ではなく「テキスト」に しておくとテキストファイルとして開くことができます。

手動でリソース・スクリプトを書いて、ビルドしているうちにおかしくなった場合

「ファイル」「ワーク・スペースを閉じる」を実行してから VC++を終了します。プロジェクトのディレクトリから、ソース・ファイル、 リソース・スクリプト、自作ヘッダファイル以外を全部削除します。 「Release」「Debug」のディレクトリも削除します。 エディタ(メモ帳など)でリソース・スクリプトを開いて自分で書き込んだ以外のものが 記入されていたら、それらをすべて削除します。

そして、プロジェクトを作りなおします。プロジェクト名を前回と同じにしておきます。 これが一番手っ取り早いです。


サンプルのプログラムをリソース・エディタを使って作りたい

という方は、サンプルのリソース・スクリプトを見て どのようなメニューとか、ダイアログボックス(ダイアログボックスの 外観はほとんどの章で図が表示されています)かを想像して リソース・エディタで作ります。これだとリソース・エディタで リソースを自由に作り直すことができます。

そのためには、リソース・スクリプトを見てどのようなリソースが 作られるのかを理解する必要があります。(ワンパターンなのでそれほど難しくは ありません)


[総合Index][メール]

Update 12/Sep/1999 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。