[index] [詰め合わせ] [ダイアログボックス] [メニュー] [アクセラレータ] [String Table] [その他]

 

その他 :
アイコン(icon)・カーソル(cursor)・ビットマップ(bitmap)
リソーススクリプトでの。

 

 アイコン・カーソル・ビットマップをモジュールに直接(まるごと)、組み込む(んでしまう)ために記述します。

 これら3つでは、リソーススクリプト内に、それぞれのファイル名を指定するだけです。但しもちろん、文法に従って記述します。それでもまったく簡単な文法です。

 

 


              
// #include <windows.h>
// #include <commctrl.h>
// #include "myprog.h"

MYBITMAP BITMAP DISCARDABLE "Relative\path\mybitmap.bmp"
MYICON   ICON   DISCARDABLE "C:\OrFullpath\myicon.ico" 
MYCURSOR CURSOR DISCARDABLE "mycursor.cur"

 


 ID(番号) などは必要なく、識別のためには名前自体 "MYBITMAP" "MYICON" "MYCURSOR" をつかいます。
 ※ ID を使って
IDC_CURSOR1 CURSOR DISCARDABLE "mycursor.cur" のように書き、あとで MAKEINTRESOURCE() マクロを使う方法もあります・・・。

 C 言語で "〜" 中の \ を表すためには \\ としますが、ここでは混同のないようにしましょう。ファイル名の"〜"中では、\ は \ 単体で OK です。たまに \\ のようにして早とちりをしたり、迷うことがあります。リソーススクリプトでは、ファイル名を間違えて、つまりそのファイルが存在しなくても、目立ったエラーが出ないから注意しておく必要があるのです。

 

 [相対パスとフルパス]
 ビットマップやアイコンを作ってさてリソーススクリプトに取り込もうというときに、しばしば迷います。

 基本的にドライブ名 (C:\ のような) から始まるつまり、絶対パス(フルパス) を使用可能です。リソーススクリプトに対する相対パスでも大丈夫なので、リソーススクリプト( .rc ) と同じディレクトリに 作成した .bmp や .ico ファイルをおいておけば、MYCURSOR の例のように、ファイル名のみの記述で済むことになります。

 注意 : ビットマップはウィンドウズ標準装備のなにかしらのソフトで作成できるはずですが、アイコンやカーソルは加工しなくてはなりません。正確にはそれぞれの "フォーマット" への変換作業が必要ですが、アイコンメーカーやカーソルメーカーは、フリー(無料) のものがありますので、それを利用しましょう。フォーマットマニアの人はそれの作成に挑戦してもいいかもしれません。フォーマット形式の資料をどこかしらで入手できれば、そんなに難しくないでしょう。

 

 [指定したファイルはいつまで必要か]
 ※ リソーススクリプトに記述して、コンパイルすると、モジュール(実行ファイル) にそれぞれのリソースが丸ごと取り込まれるので、それらのファイル(.bmp や .ico) は、コンパイル以降は、実行ファイルにとっては、必要ないことになります。

 

リソーススクリプトの記述に関してはこんなに簡単です。

 

 [必要性] このようにリソーススクリプトに書かなくても、メインプログラム(ソース)で動的にファイル(名)からロードできればリソーススクリプトに書かなくてもいいや、と考えるのは自然ですが、(Win32 API では) それを単純に行う方法はありません (単純さを放棄すればできないことはありません)。

 参考として、OleLoadPicture() 関数 と、COM オブジェクトの一つ IPicture オブジェクト(インターフェース) を使う方法では、ダイレクトにファイルから読み込んで処理していきます。この方法ではビットマップのほか、 jpg なども扱えます。IPicture のメンバ関数 Render() は 「HDC」 に描画するので、通常どおりの手法で描画が行えます。ただしそこでは HBITMAP 型 ビットマップハンドルは使われません。この話は 「画」 を扱う場合の例外的なお話です。

 つまり、ビットマップ・アイコン・カーソルを利用する場面ではあらかじめリソーススクリプトで定義しておくことが必要となります。そして下の所定の関数でロードし、返されるハンドルを使ってなにごとも行います

 

  [関数] 記述したものはどう利用されるのかを示してみましょう。 


HBITMAP hBitmap = LoadBitmap( GetModuleHandle(NULL) , "MYBITMAP" ) ;
HICON   hIco    = LoadIcon  ( GetModuleHandle(NULL) , "MYICON"   ) ;
HCURSOR hCursor = LoadCursor( GetModuleHandle(NULL) , "MYCURSOR" ) ; 

 ※ GetModuleHandle(NULL) は面倒なのでこうしています。アプリ初期化時のインスタンスハンドルを変数 (hAppInst などのような) に入れてとってあれば、それを使用できます。

 

 [このハンドルはどうやって使うのか]
 ロードしてしまえば、リソーススクリプトの役目ここでもう終わりです。これ以降はそれぞれのリソース (オブジェクト) をどう扱うのかにより個別な処理をすることになります。簡単に述べておきます。

ビットマップ : ウィンドウにビットマップを描画することがメインイベントとなるでしょうか。手順を順番に、且つ端的に示すと次のようになります。

LoadBitmap()、WM_PAINT、CreateComptibleDC()、SelectObject()、BitBlt() や StretchBlt()、〜アプリ終了時 DeleteObject() 。

 その他、メニューやツールバーにビットマップ(画)を表示、クリップボードのビットマップ、ビットマップのファイルへの保存・・・ などの場面で、いつも ビットマップハンドル (HBITMAP 型) を使います。

アイコン : つまらない一例です。SetClassLong() と GCL_HICON 。アプリケーションのベースのアイコンを変えてしまいます。RegisterClass() でアプリのはじめに登録したもの を、かえることになります。

カーソル : SetClassLong() と GCL_HCURSOR SetCursor() SetCursor() は一時的にカーソルをかえるための関数です。やはり カーソルのハンドル( HCURSOR 型) が必要です。

★ アイコン、カーソルのハンドルは、アプリ初期化時の RegisterClass() の際の、WNDCLASS 構造体 ( 例えば変数名 "wc" ) の構成のときにも同様に使います。スケルトンコード を見てみるといいでしょう。

 

 [開放] リソースをロードした場合、ビットマップだけは、そのビットマップをロードして、使い終わったらDeleteObject() 関数で開放しないといけません。使い終わらない場合はアプリケーションの終了時に開放する、ということになるでしょう。アイコンやカーソルをロードした場合は開放する必要はありません。

 ※ ここはリソーススクリプトのお話です。リソーススクリプトに記述したリソースは、ロードするだけなので、動的にオブジェクトを「作成」 した場合は除いて述べています。すなわち、「作成」 したアイコンやカーソルなら、上の例によらずオブジェクトを (所定の関数 : DestroyIcon() と DestroyCursor() により) 開放する必要があるでしょう。

 

-------------------------------------------------------

 

 LoadBitmap()、LoadIcon()、LoadCursor() 各関数では、第一引数のインスタンスハンドルを NULL 、にすると、第2引数に適切な値を指定することにより、システムにプリインストールのビットマップやアイコン、カーソルをロードできます。このときも ビットマップだけは開放が必要です。

LoadCursor( NULL, IDC_ARROW ) ;

つまり、これを知らず "" のカーソルを自作するのはしばしば無駄ぼねです。

 


 ・・・・・ここは、リソーススクリプトの説明を試みる部屋なのです。

 

[トップ] [level4:言葉] [index]