第7回 PilRC の定義ファイルの書き方 (2) -- アイコン/ビットマップ

この講座で今まで作ってきたアプリケーションには独自のアイコンがありませんでした。 このままでは味気ないので、オリジナルのアイコンを作ってみましょう。 アイコンを追加するのと同様の手順で、 アプリケーションの画面に表示するビットマップの絵を作成することができますので、 その手順も併せて説明することにします。

アイコンとビットマップはリソースとしてアプリケーション・プログラムのリソース・データベースに入れられます。

PalmOS が搭載されたデバイスの表示能力は、白黒、グレイスケール、256色カラー、と異なります。 表示能力の異なる各デバイスでその能力に応じて適切なアイコンを表示できるように、 アイコン・ファミリと呼ばれるリソースに色数の異なる複数のアイコンをまとめて格納することができます。

ビットマップもアイコンと同様に色数の異なるものをビットマップ・ファミリと呼ばれるリソースにまとめて格納することができます。

このように色数の異なるアイコン、ビットマップをひとつのリソースにまとめておくと、 そのアプリケーションがインストールされたデバイスの表示能力に応じて適切なアイコン、 ビットマップが OS により選択され表示されます。 アプリケーションを作成するみなさんがプログラム作成時に色数を意識しなくても良いようになっています。

それでは、画面にビットマップで "Hello World" と表示するアイコン付きのアプリケーションを作ってみましょう。

準備

前回までは、都度、クリエータ ID の登録や作業ディレクトリの作成から説明していました。 そろそろ慣れて来たと思いますので、今回からは、その説明は省略することにします。

ビットマップ・ファイルの作成

最初に、画像編集ソフト等を使ってアイコン、ビットマップのファイルを作成します。 そのファイルを PilRC を使ってリソースの形式に変換します。

ビットマップの変換

ビットマップの変換

PilRC 扱えるビットマップの形式は

  • Windows の BMP 形式
  • テキスト形式
  • X11 の xbm 形式
  • PBM/PGM/PPM の形式

のいずれかです。今回は Windows の BMP 形式を用いてビットマップを作成することにします。

ビットマップ・ファイルは一般の画像編集用のツールで作成します。 BMP 形式が扱えるツールであれば何でもかまいません。 筆者は Gimp を使ってビットマップ・ファイルを作成しています。

アイコンを作成するときには 22×22 ピクセルで、白黒、4階調のグレイスケール、 16階調のグレイスケール、256色のカラーのビットマップ・ファイルを作成します。

ここでは作業ディレクトリの中に images という名前のディレクトリを作って、 その中にアイコン用のビットマップ・ファイル Icon22x22x1.bmpIcon22x22x2.bmpIcon22x22x4.bmpIcon22x22x8.bmp を作っておくことにします。

同様にしてディレクトリ images の中に "Hello World" という文字を表示するためのビットマップ・ファイル Hello1.bmpHello2.bmpHello4.bmpHello8.bmp を作っておきます。

PilRC の定義ファイルの作成

アイコンの記述を追加

作成したアイコンをリソースに追加するために、PilRC の定義ファイルにアイコン・ファミリのための記述を追加します。

// アイコン
ICONFAMILY "images/Icon22x22x1.bmp"
           "images/Icon22x22x2.bmp"
           "images/Icon22x22x4.bmp"
           "images/Icon22x22x8.bmp" TRANSPARENTINDEX 0

アイコン・ファミリの記述

ICONFAMILY で、アイコン・ファミリのリソースを生成します。 ICONFAMILY の定義では白黒、4階調のグレイスケール、16階調のグレイスケール、 256色のカラーの 4 個のビットマップ・ファイルを順に指定します。 最後の TRANSPARENTINDEX 0 は透過にする部分のカラーのインデクス値を指定します。 ここでは白い部分を透過にするために 0 を指定しています。

ビットマップの記述を追加

続いて、作成したビットマップをリソースに追加するためにビットマップ・ファミリのための記述を追加します。

// Hello World のビットマップイメージ
BITMAPFAMILY ID MainFormBitmap
             "images/Hello1.bmp"
             "images/Hello2.bmp"
             "images/Hello4.bmp"
             "images/Hello8.bmp"

ビットマップ・ファミリの記述

BITMAPFAMILY でビットマップ・ファミリのリソースを生成します。 MainFormBitmap がリソースの ID となります。 アイコン・ファミリと同様に色数の違う 4 個のビットマップ・ファイルを指定します。

このビットマップ・ファミリで作成されたビットマップを、 フォームを使って画面に表示することにします。そのために、以下のようにフォームを記述します。

// Hello World を表示するためのフォーム
FORM MainForm AT (0 0 160 160) /* 全画面 (160x160). ID は MainForm */
MENUID MainFormMenuBar
BEGIN
  TITLE "Hello..." /* フォームのタイトル */
  FORMBITMAP AT (80-52 CENTER) BITMAP MainFormBitmap /* フォームの中央に表示する */
END

ビットマップ・ファミリを利用するフォームの記述

FORMBITMAP でビットマップをフォーム中に表示するように指定します。 表示すべきビットマップは BITMAP MainFormBitmap でリソース ID を使って指定します。

このように作成したリソースを第6回で作成したプログラムとあわせて使用すると、 アプリケーション起動時に画面の中央にビットマップ・ファミリで指定した画像のいずれかが表示されます。

Hello World

m505 で実行した場合の画面

表示色数の変更機能の追加

一般的なアプリケーションでは、上述のように適切な色数の画像が表示できれば十分です。 しかし、手元のデバイスのみで画像が表示できても、 ビットマップ・ファミリは本当に正しくできているのだろうか、他 のデバイスでも正しく表示されるのだろうかという心配が残ると思います。

この不安を解消するために、手元のデバイスで意図的に表示可能な色数を減らす機能を追加して、 ビットマップ・ファミリの他の色数の画像を表示させてみましょう (当然のことですが、ビットマップ・ファミリのすべてのビットマップが正しくできていることを確認するには 256 色以上表示できるデバイスが必要です)。

始めに、MainForm のメニューに色数を変更する項目を追加します。

MENU ID MainFormMenuBar /* MainForm のメニュー・バー */
BEGIN
  PULLDOWN "Hello" /* 最初のメニュー. タイトルとして "Hello" と表示される */
  BEGIN
    /* 色数を変更するための項目 */
    MENUITEM "B/W" MainFormScreenDepth1Cmd
    MENUITEM "2 Bit Grayscale" MainFormScreenDepth2Cmd
    MENUITEM "4 Bit Grayscale" MainFormScreenDepth4Cmd
    MENUITEM "256 Colors" MainFormScreenDepth8Cmd
    /* About 画面を表示するための項目. 
       コマンドストローク + "H" でも起動できる */
    MENUITEM "About..." ID MainFormAboutCmd "H"
  END
END

色数を変更する機能のメニュー

メニュー項目に応じて表示モードを変更する機能は、 第6回のプログラムに新たな関数 ChangeColorDepth() を追加し、 メニューの処理を以下のように変更することで実現できます。

/*
 * ChangeColorDepth -- 色数の設定を変更する
 * 
 * 色数の設定を変更する
 */
static void ChangeColorDepth(UInt32 depth)
{
    WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL);
    FrmUpdateForm(MainForm, frmRedrawUpdateCode);
}

色数を変更する関数 ChangeColorDepth()

    case menuEvent: // メニューが選ばれた
        s;witch (event->data.menu.itemID) {
        case MainFormScreenDepth1Cmd: // "B/W" が選択された
            ChangeColorDepth(1);
            handled = true;
            break;
        case MainFormScreenDepth2Cmd: // "2 Bit Grayscale" が選択された
            ChangeColorDepth(2);
            handled = true;
            break;
        case MainFormScreenDepth4Cmd: // "4 Bit Grayscale" が選択された
            ChangeColorDepth(4);
            handled = true;
            break;
        case MainFormScreenDepth8Cmd: // "256 Colors" が選択された
            ChangeColorDepth(8);
            handled = true;
            break;
        case MainFormAboutCmd: // "About..." が選択された
            OpenAboutDialog(); // About 画面を表示する
            handled = true;
            break;
        }
        break;

色数を変更するメニューの処理

ここまで説明してきた PilRC の定義ファイルの一部やプログラムの断片を完全なものにまとめたものを BitmapHelloWorld.zip または BitmapHelloWorld.tgz として置いてありますので、 適宜ご利用下さい。 この中に入っているプログラムでは、 実行中の OS でWinScreenMode() が使えるか否かを確認する処理が追加されていますので参考にしてください。

コンパイル

コンパイルの方法は、ファイル名が違うことを除けば、今までと同じです。

まず BitmapHelloWorld.c を gcc を使ってコンパイルしてみましょう。 ファイルをつくったディレクトリで以下のコマンドを実行してください。

% /usr/local/pilot/bin/m68k-palmos-gcc -palmos3.5 -o BitmapHelloWorld BitmapHelloWorld.c

続いて BitmapHelloWorld.rcp を pilrc を使ってコンパイルしてみましょう。 ファイルをつくったディレクトリで以下のコマンドを実行してください。

% /usr/local/bin/pilrc BitmapHelloWorld.rcp

このコマンドでビットマップ・ファイルの内容がリソースの形式に変換されます。 生成される7個のファイルの中の、Tbmp03e9.bin がビットマップ・ファミリのリソース、 tAIB03e8.bin がアイコン・ファミリのリソースです。

リソース・データベースの作成

リソース・データベースの作成方法は今までと同じです。

% /usr/local/pilot/bin/build-prc -t appl BitmapHelloWorld.prc "Hello World" YS00 BitmapHelloWorld *.bin

これを実行すると BitmapHelloWorld.prc という名前でリソース・データベースのファイルが作成されます。 これでアプリケーションが完成です。

実行

できあがったアプリケーションを、POSE にインストールして、先ほど作成したアイコンが表示されることを確認しましょう。下の例も、Palm m505 (256色カラー) で実行した場合の画面です。白黒のデバイスでは白黒のアイコンが表示されます。

Icon

アイコン

アプリケーションを起動すると画面の中央にビットマップで "Hello World" と表示されます。下の例も、Palm m505 で実行した場合の画面です。

Hello World (256 colors)

256色のイメージの表示

メニューで色数を変更すると、それに対応したビットマップが表示されます。

Hello World (4 bit grayscale) Hello World (2 bit grayscale) Hello World (Black and white)

16階調

4階調

白黒

このように、アイコン・ファミリ、ビットマップ・ファミリを使うことで表示可能な色数が異なるデバイスに対してもその違いを意識せずにプログラムを書けることが判っていただけたかと思います。



Copyright (c) 2002 WATANABE, Yoshiki