リソースファイル

前ページまでで図形の描画関数の説明をしましたが、複雑な図形はプログラム上で描画するよりも画像ファイルを別途用意して表示するほうが簡単です。

画像ファイルでよく使用されるのはJPG、GIF、PNGなどですが、GDI関数で扱えるのはビットマップ(.bmp)のみです。
他の画像形式の表示はGDI+というまた別の関数群を使用する必要があります。
ここではビットマップファイルを表示する方法を説明します。

ビットマップ画像はご自身で適当なものを用意してください。
Windows付属の「ペイント」のほか、大抵の画像編集ソフトで作成可能です。
面倒ならば以下のサンプル画像をダウンロードして使用してください。
(128×128ピクセル)
ビットマップ画像のサンプル

リソースファイルの作成

実行ファイルはソースコードをコンパイルすることで作られますが、プログラムはコンパイラが生成するデータ以外にも様々なデータを利用することがあります。
(画像データや音声データなど)
これらのデータ全般をリソースといいます。

リソースの管理のために、Visual Studioはリソースファイル(リソーススクリプトファイル)を使用します。
これにより、リソースを実行ファイルに埋め込むことができます。

まずはリソースファイルを作成してみましょう。

ソリュージョンエクスプローラーのプロジェクトツリー内に「リソースファイル」という項目があります。
これを右クリックして「追加」→「新しい項目」を選択します。
リソースファイルの追加1

開いたウィンドウの左側から「Visual C++」→「リソース」を選択し、真ん中のリストから「リソースファイル(.rc)」を選択します。
ウィンドウ下部の「追加」を押下するとリソースファイルが追加されます。
リソースファイルの追加2
リソースファイルの追加3

Resource.rc」(名前は任意に変更可能)のほか、「ヘッダーファイル」内に「resource.h」も自動的に追加されています。

「Resource.rc」をダブルクリックするとソリュージョンエクスプローラーが「リソースビュー」というペイン(枠)に切り替わります。
ここに「Resource.rc」という項目がありますので、右クリック→「リソースの追加」を選択します。
リソースファイルの追加4

開いたウィンドウの右側から「インポート」を選択するとファイル選択ダイアログが開くので、任意のビットマップ画像を選択します。
ちなみにここで左側の項目から「Bitmap」を選択して「新規作成」を押下すると、空のビットマップが作成されます。
リソースファイルの追加5

ビットマップ画像は、Visual Studioのプロジェクトフォルダ内(ソースファイルと同じ場所)にコピーしておいてください。
もしくは、ソースファイルと同じ階層に専用のフォルダを作ってそこに画像をまとめても良いです。
プロジェクトフォルダ外のファイルを使用すると、リソースの追加後に元の画像ファイルの移動や削除、名前変更などをしてしまうとファイルが見つからなくなりコンパイルできなくなります。
コンパイルに必要なファイルは全てプロジェクトフォルダ内に含めることをお勧めします。

今回は一番最初の手順で、ソリュージョンエクスプローラーから「リソースファイル」を右クリック→「追加」→「新しい項目」を選択しました。
ここで「新しい項目」ではなく「リソース」を選択することで、リソースファイルの作成と「リソースの追加」ダイアログを開く操作が自動的に行われます。
その後の手順は同じです。

この時生成されるリソースファイル名は「プロジェクト名.rc」となります。

リソースを追加する場合もこの手順で可能です。
リソースファイルは既に存在するので、リソースファイルを生成する手順は必要ありません。

ソリュージョンエクスプローラーから「リソースファイル」を右クリック→「追加」→「既存の項目」でビットマップファイルを追加することはできますが、これはプロジェクトにファイルが追加されるだけで、リソースとして追加はされていません。
リソーススクリプトとヘッダファイルに手動で情報を追加する必要があります。

ビットマップエディタが開くかもしれませんが、使用しないので閉じて構いません。
(必要ならここでビットマップ画像を編集できます)
リソースファイルの追加6

これでリソースファイルおよびリソース(画像)の追加は完了です。
次ページでは、これを実際にプログラムから表示する方法を説明します。

リソーススクリプトファイルの中身

リソースは画像や音声などの(ソースコード以外の)データです。
Visual Studioはビットマップエディタを持っているのでビットマップファイルは編集可能です。
また、文字列もリソースとして持てるのでこれも編集できます。
それ以外のリソースは編集できません。
(正確には編集できるがバイナリエディタによる16進数での編集になる)

対して、リソースファイル(リソーススクリプトおよびヘッダーファイル)の中身はただのテキストです。
プログラミング言語のソースコードのように、リソースファイルの書式に従ってリソースを管理するための情報が記述されています。
ただのテキストファイルなので、Visual Studioから編集可能です。

実際にリソースファイルを開いてみましょう。
ソリュージョンエクスプローラーから「Resource.rc」を右クリックし、表示されたメニューから「コードの表示」を選択します。
リソースファイルの編集1

「既にファイルが開かれています」というようなダイアログが表示された場合は「はい」を選択してください。
「ファイルを保存しますか」というダイアログが表示された場合も同様に「はい」を選択してください。
リソースファイルの編集2 width=

するとリソーススクリプトファイルの中身が表示されます。
Visual Studioは以下のようなリソースファイルを自動生成します。
(バージョンにより多少異なるかもしれません)


// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 日本語 (日本) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#pragma code_page(932)

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//

IDB_BITMAP1             BITMAP                  "sample.bmp"

#endif    // 日本語 (日本) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

注目するのは以下の「Bitmap」セクションです。


/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//

IDB_BITMAP1             BITMAP                  "sample.bmp"

これは上記の手順で「sample.bmp」をリソースに追加したことにより追加された項目です。
なんとなくわかると思いますが、右端はファイル名です。
(相対パス)
真ん中はリソースの種類がビットマップであることを表しています。
左端はリソースの識別子で、プログラムからはこの識別子を使用してリソースを呼び出します。

今度は、自動生成されたヘッダーファイル「resource.h」ファイルを開いてみます。


//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ で生成されたインクルード ファイル。
// Resource.rc で使用
//
#define IDB_BITMAP1                     101

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

最初のほうに「IDB_BITMAP1」がdefineされています。
これは先ほどのビットマップの識別子と同じです。

識別子は自動的に割り振られますが、変更することもできます。
変更した場合の動作については次ページで説明します。

「Resource.rc」および「resource.h」を開いた状態ではリソースの追加ができません。
リソースを追加する場合は一度エディタを閉じてください。
(Visual Studio以外から開いている場合も同様)