2009年06月30日

第0x05回 Windowsの資源〜リソース〜

ウィンドウも出し、グラフィカルな操作も行い、
やっとWindowsのプログラムらしくなってきました。
今回は、前回に出てきたペンやブラシなど、Windowsに定義されているリソースについて
踏み込んでいきたいと思います。

Windowsは、ユーザからの操作や情報の表示をグラフィカルに行っています。
このようなユーザインターフェースのことをGUI(Graphical User Interface)といいます。
Windowsでは、マウスやウィンドウ、アイコンなどを用いて、それを実現しています。
ユーザに対して、直感的でわかりやすい操作を提供している反面、
プログラマにとっては、実際の機能以外に
これらインターフェース部分の実装まで考えなければならず、頭の痛い問題となります。

しかし今までプログラムしてきたように、
Windowsでは極力意識せずにプログラムできるようになっています。
ウィンドウやメニューなど、ほとんどのアプリケーションが使用するものに関しては、
既に用意されています。
このWindows固有のオブジェクトのことをリソースと呼びます。
リソースはメモリ上に確保され、その他のメモリ領域に確保されているデータとは
別物として管理されています。(※1)

ここでは、今までに作ってきたものに、メニュー・アイコン・カーソルを追加してみます。
これら全てはリソースとして扱われています。
では、早速サンプルを見てみましょう。


(プロジェクトファイル)
sample005.zip


VisualStudioでは、リソースを統合環境上で追加することができます。
リソースを追加するには、作成中のプロジェクトを右クリックし、
メニューより「追加」→「リソース」を選択します。

win_005_001.png

追加するリソースを選択する画面が出てくるので、
メニューを選択し、「新規作成」を選択します。

win_005_002.png

メニューを作成する画面が出てきますので、適宜メニューを追加していきます。
今回は、「ファイル(&F)」と「オプション(&O)」の2つのメニューで、
さらに「ファイル(&F)」が選択された場合に、「終了(&X)」が出てくるようにします。
メニュー名の横についている(&F)とは、メニューに対するショートカットキーで、
Alt+指定のキーでそのメニューが選択されるようになります。
Windowsのアプリケーションのほぼ全てに、そのようなショートカットがついていますので、
ここでもその作法に則っています。

win_005_003.png

各メニューを追加するときに、同時にプロパティも設定します。
いくつか説明します。
ID   :メニューを識別するためのID
Caption:メニューのタイトル
Enabled:メニューの初期有効性
Grayed :メニューの初期選択可能状態
Popup :ポップアップメニューかどうか
     Trueの場合、このメニューの下にさらにメニューがくる

「オプション(&O)」と「終了(&X)」は選択するメニューですので、
PopupをFalseにします。
「ファイル(&F)」は、それ自身を選択することはなく、下に子メニューを持つので
PopupをTrueにします。

これで、メニューの準備ができました。
同様にアイコン、カーソルも追加します。

これら作成したリソースは「sample005.rc」ファイルとして保存されます。
このファイルをテキストエディタで開くと、実際にはどのように定義されているか
大まかにわかると思います。
これらの定義についてはここでは省略します。


では作成したリソースをプログラムに組み込んでいきましょう。
前準備として、先ほどのリソースと同時に作成された「resource.h」を
インクルードします。
#include "resource.h"

このヘッダでは、リソースを識別するためのIDが定義されています。
このIDを元に、プログラムでリソースを指定します。

ウィンドウにリソースを追加するには、
ウィンドウを定義するウィンドウクラスの指定を変えてあげる必要があります。
wcl.hIcon   = LoadIcon( hInstance , (LPCWSTR)IDI_ICON1 );    // ウィンドウのアイコン
wcl.hCursor = LoadCursor( hInstance , (LPCWSTR)IDC_CURSOR1 );// ウィンドウのカーソル

以前のプログラムまで、Windowsに用意されていたアイコンとカーソルを
今回作成したものに差し替えます。
リソースはリンク時に実行ファイルに含められるので、
ここでは、上記関数の第1引数で、リソースの定義されている場所、
すなわち自分自身のインスタンスを指定します。
第2引数で、resource.hに定義されているIDを文字列として渡してあげます。

さらにメニューを追加します。
wcl.lpszMenuName = (LPCWSTR)IDR_MENU1;

これで全ての準備が整いました。

メニューが選択された場合、メッセージとして飛んできますので、
メッセージハンドラにメニューに対する処理を追加します。
case WM_COMMAND:
// メニュー処理
switch( LOWORD( wParam ) )
{
case ID_MENU_EXIT: // 「終了(&X)」
// アプリケーションを終了させる
PostQuitMessage( 0 );
break;
case ID_MENU_OPTION: // 「オプション(&O)」
// とりあえずの処理
MessageBox( hWnd , TEXT("メニューのオプションが選択された") , TEXT("メニュー") , MB_OK | MB_ICONINFORMATION );
return 1;
}
break;

メニューが選択されると、WM_COMMANDメッセージが飛んできます。
このメッセージは、wParamの下位16ビットに選択された
メニューのIDが渡されますので、その値を元に条件分岐させます。

次回では、さらに「オプション(&O)」の処理として
設定画面が出せるよう、ダイアログについて触れたいと思います。

(※1)
Windows 95/98/MEなどのWin9x系では、
作成できるリソースは、4MBまでという制限があります。
Windows 2000/XP/VistaなどのWinNT系では
そのような制限がないため、開発でNTを用いてプログラムする上で
この点に注意しないと、9x系で動かなくなってしまいます。



ラベル:ふわ猫
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。