プログラム講座 初級編14

- 色を選択しよう -

 初級編14です。今回は「カラーピッカーから色を選択して表示する」という処理を行います。




カラーピッカーを表示するには?
 Macintoshでカラーを選択する場合に目にするのが「カラーピッカー」です。その名のごとく「多色中の1色」を選択すrダイアログです。多色といってもMacintoshの場合、1677万色ではなく248色です。これはRGB各16ビットまでの値(0〜65535)を扱うようになっているためです。特にMacintoshだけが各色16ビットではなくSGIのマシンやBeOSも同様です。
 さて、このカラーピッカーですが実は2種類あります。以下にそれぞれのカラーピッカーを示します。

  • 昔からのカラーピッカー


  • 新しいカラーピッカー


     新しいカラーピッカーは確かSystem 7.5(KT7.5)以降に機能拡張として入ってきます。あまり使い勝手の良くないカラーピッカーですが、自分で1から作成するよりは楽ですf(^^;
     カラーピッカーはハンドブックマニュアルの249ページのColor Picker Packageに呼び出し方法が記載されています。呼び出し方法は以下のようになっています。

    Byte = FN GETCOLOR(point, prompt$, rgbColor1, rgbColor2)

     これだけでは、はっきり言ってわからん!という人もいると思います(rgbColorについては説明用として番号をつけてあります)。次の章でそれぞれのパラメータ(引数)について説明します。



    カラーピッカーの引数
     それではカラーピッカーの引数について説明します。
    point
    これはカラーピッカーを表示する位置を指定します。位置と言ってもX,Y座標で簡単に指定できるわけではありません。最初に「レコード」を作成しておかなければなりません。これは以下のように宣言しておきます。

    DIM dispPoint.4

    .4は「4バイトのメモリを確保しなさい」という意味です。次に以下のようにしてXY座標を指定します。

    dispPoint.h = 50 [X座標]
    dispPoint.v = 50 [Y座標]

    このような指定方法は他にも出てきますので、覚えて置いた方がいいかもしれません。.h, .vはあらかじめ定義されている値です。dispPoint.0といった指定もできますが、わかりにくくなってしまうので、このような表記は避けましょう。


    prompt$
    カラーピッカー左上に表示される文字列です。通常は「色を選択してください」等の文字列になります。昔のタイプのカラーピッカーでは日本語にして約17文字程度しか表示しませんので、あまり長い文字はやめましょう。


    rgbColor1,rgbColor2
    rgbColor1は現在のカラーを指定します。現在のカラーというと語弊があるかもしれません。rgbColor1が変更前のカラーでrgbColor2が指定されたカラーを返すパラメータ(引数)になっています。この指定方法もpointと同じ「レコード」になっています。RGBそれぞれ16ビット、つまり2バイト×3=6バイト必要です。宣言は以下のようになります。

    DIM myRGB.rgbColor

    .rgbColorはFuture BASICで6として設定されています。つまりDIM myRGB.6としても全く同じ事になります。前にも書きましたが、いきなり数値を指定すると後々プログラムを見たときにわからなくなってしまう事がありますし、わかりにくいのでなるべく定義されている定数を使いましょう。


    Byte
    カラーピッカーで色が選択されたか、キャンセルされたかを返します。_TRUE(真)の場合は色が選択された、_FALSE(偽)の場合はキャンセルされた事を示します。処理する場合は、もちろん色が選択された場合のみ行います。
     呼び出し方法をちょっと変えて書いた方がわかりやすい気がします。

    フラグ = FN GETCOLOR(座標,表示文字列,設定前の色,設定後の色)



    設定した色をFuture BASICで使うには?
     カラーピッカーで選択された色をFuture BASICで使うにはどうしたらよいのでしょうか。方法は2つあって1つは「LONG COLOR b,g,r」というあらかじめ用意されている命令を使用するもの、もう1つは「Toolboxを呼び出す」方法です。今回作成したプログラムではToolboxを呼び出して色を設定しています。色を設定する場合、前景色と背景色の2種類があるので注意してください。前景色はCALL RGBFORECOLOR、背景色はCALL RGBBACKCOLORを使って設定します。
     LONG COLORを使用する場合は以下のようになります。

    LONG COLOR newRGB.blue%,newRGB.green%,newRGB.ref%

     どちらでも、同じです。好きな方を使えばよいでしょう。
     色を設定すればBOXやCIRCLEなど描画する命令全てに対して有効になります。今回は2つ色を設定しBOX FILLで表示しています。



    終わりに
     標準のカラーピッカーは色が選択しにくいので本当は自前で作った方がよいのではないかと思います。特にお絵かきソフトなど色を設定する機会が多いものなど標準のカラーピッカーを使っていたのでは疲れてしまいます(^^;
     次回は今回のプログラムを変更してグラデーションの描画について解説します。



    今回のプログラムリスト
    ' ' "カラーピッカーを表示して色を選びます(^^)" ' LOCAL FN getRGB DIM oldRGB.rgbColor,newRGB.rgbColor DIM disp.4 ' "カラーピッカーの表示位置を設定します" disp.v% = 50: ' "disp.0 = 50という書き方もできます" disp.h% = 150: ' "disp.2 = 150という書き方もできます" oldRGB.red% = 65535: ' "RGBは8ビットではなく16ビット指定" oldRGB.green% = 65535: ' "とりあえず初期値は白色にしておく" oldRGB.blue% = 65535 ' "カラーピッカーを表示(機能拡張により異なる)" flag% = FN GETCOLOR(disp,"最初の色を選んでね(^-^)/",oldRGB,oldRGB) flag% = FN GETCOLOR(disp,"2番目の色を選んでね(^-^)/",oldRGB,newRGB) ' "返り値が真(_TRUE)の時は選択された。偽(_false)の時はキャンセルされた" LONG IF flag% WINDOW #1,"getRGB",(0,0)-(250,280),_docNoGrow:' "ウィンドウを開く" PRINT "Click to Quit..." CALL RGBFORECOLOR(#@oldRGB): ' "RGBカラーを設定" BOX FILL 0,50 TO 100,150: ' "塗りつぶされた箱を描画" CALL RGBFORECOLOR(#@newRGB) BOX FILL 100,150 TO 200,250 WHILE FN BUTTON = _false:WEND: ' "ボタンが押されるまで待つ" WINDOW CLOSE #1: ' "ウィンドウを閉じる" END IF END FN FN getRGB