[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]

# 6 Color Mixingウィジェットの使用

この章では，アプリケーションでColor Mixingウィジェットを使用する方法について説明します。 内容は次のとおりです。

- DECwindows MotifツールキットにおけるColor Mixingウィジェットの概要

- Color Mixingウィジェットのための支援ルーチンの説明

さらに，さまざまなカラー・モデルをサポートするために，Color Mixing ウィジェットを変更する方法についても説明します。

# 6.1 Color Mixingウィジェットの概要

Color Mixingウィジェットを使用すると，DECwindows Motifアプリケーションはエンド・ ユーザにカラーについて問い合わせることができます。たとえば， アプリケーションにパイ・チャートがある場合，Color Mixingウィジェットを使用して， ユーザにパイ・チャートで使用するカラーについて問い合わせることができます。Color Mixing ウィジェットはユーザに即座にフィードバックを戻し， 新しい色が選択されるたびにそれを表示します。

Color Mixingウィジェットを使用すると，ユーザは最高5つのカラー・ モデルから選択できます。このウィジェットは静的な色名指定，動的な色補間( 色調の混合)，標準配色をサポートします。異なるカラー・モデルを別々に使用することも， 一緒に使用することも可能です。省略時の設定では，Color Mixing ウィジェットは第6.3 節で説明するカラー・モデルをサポートします。ただし，Color Mixingウィジェットを変更して，他のカラー・モデルをサポートすることもできます( 第6.5節を参照)。

Color Mixingウィジェットは多種多様なカラー・モデルをサポートしますが，RGB ( 赤，緑，青)値を使用してアプリケーションとやりとりします。 これは，X Window Systemバージョン11では，色は赤，緑，青の濃淡で指定されるためです。 濃淡は0から65535までの値で表されます。Color Mixingウィジェットは色をX11のRGB値に変換するため，アプリケーションのプログラマはユーザがどのカラー・ モデルを使用して色を指定するのかを考慮する必要はありません。

Color Mixingウィジェットは，カラー使用の初心者と上級者の両方を対象としています。 初心者はカラーの理論を理解しなくても希望する色を生成することができ， 上級者はRGB値やX11指定のカラーに関する知識を活用しながら色を選択することができます。

Color Mixingウィジェットは，256色を同時に表示できる8プレーンのカラー・ システム上で最適に実行できるように設計されていますが，True Color，グレースケール，モノクロ・システムを始め，DECwindowsがサポートするすべての構成上で実行できます。Color Mixing ウィジェットは自動的にディスプレイに適合し， ハードウェアがサポートできるすべてのカラー機能を提供します。

Color Mixingウィジェットを使用するDECwindowsのアプリケーションには， セッションおよびウィンドウ・マネージャ，DECpaint，DECwindows Mail，DECburgerデモ用アプリケーションがあります。これらのアプリケーションのいずれを使用しても，Color Mixing ウィジェットの機能に慣れることができます。

# 6.2 Color Mixingウィジェットの資源

Color Mixingウィジェットはさまざまなカラー・モデルでカラーを表現するために， 最高29のカラー・セルを割り当てます。カラー・セルは次の順序で割り当てられます。

1. 新規の色に対して1つのセル。

2. もとの色に対して1つのセル。

3. 背景色に対して1つのセル。

4. 色選択カラー・モデルのカラー・スペクトルに対して10のセル。10 のセルが利用できない場合には，色選択カラー・モデルのオプションがかすんで表示される。

5. 色選択カラー・モデルの色補間に対して10のセル。10のセルが利用できない場合でも， 色選択カラー・モデルは機能するが，色補間の機能はかすんで表示される。

6. 色名指定カラー・モデルの命名された色のリストのうち，見えている項目に対して5 つのセル。これらのセルが利用できない場合，命名された色はそれぞれの色でなく， 白黒で表示される。

7. スクラッチ・パッドに対して1つのカラー・セル。

注意
  Color Mixingウィジェットは， アプリケーションに代わって資源を割り当てることはありません。アプリケーションがカラー表示に必要なシステム・ カラー資源を割り当てなければなりません。

# 6.3 カラー・モデル

カラー・モデルは，的確に色を指定できる抽象的な表現です。Color Mixingウィジェットは次のカラー・モデルをサポートします。

- 色選択カラー・モデル

- HLS (色調，明度，彩度)配合カラー・モデル

- RGB (赤，緑，青)配合カラー・モデル

- 色名指定( X11の命名された色)カラー・モデル

- グレー・スケール・ミキサ

アプリケーションのユーザはカラー・モデルを独立して使用して，色を選択することができます。 また，ユーザは好きなカラー・モデルを使用して色を選択したのち， 色選択カラー・モデルを使用して，選択した色を好みの色に塗る( 混ぜる)こともできます。

次以降の節で，サポートしているカラー・モデルについて説明します。

## 6.3.1 色選択カラー・モデル

色選択カラー・モデルはカラー・システムにおけるColor Mixingウィジェットの省略時のカラー・ モデルです(色選択カラー・モデルはカラーでないシステムや， 資源が少なすぎるシステムでは表示されません)。ユーザは色選択カラー・ モデルを使用して，静的カラー・スペクトル(または別のカラー・ モデル)から色を取り出し，その色をそのまま使用することも， それを使用して新しい色を生成することもできます。ユーザはまた， スペクトルから2つの色を取り出し，それらを互いに混ぜ合わせて，好みの色を作成することもできます。

ユーザは色選択カラー・モデルによって表示されるどの色でも，好みに合わせて選択することができます。

色選択カラー・モデルは10色のスペクトルとそのタイトル，色補間とそのタイトル， 「塗る」ボタン，「取消」ボタン，2つのペイント・バケツ・ ボタン，および補間色の暖かさと明るさを制御する矢印ボタンから構成されます。

図 6-1は色選択カラー・ モデルが選択されているColor Mixing ウィジェットの構成要素を示しています。

### 図 6-1 Color Mixingウィジェットの構成要素( 色選択カラー・モデル)

### 6.3.1.1 色選択カラー・モデルのスペクトル

カラー・スペクトルは色の静的な集合です。「スペクトル」プルダウン・ メニューを使用すると，ユーザはスペクトルを4つの共通なカラー・パレットのうちの1 つに設定できます。

- 典型的なスペクトル(白，赤，オレンジ，黄，緑，青，青紫， 紫，茶，黒)

- 明色調

- 中間調

- 濁色調

これら4つのカラー・パレットを使用することにより，ユーザは多種多様な色から選択することができます。 アプリケーションは別のパレットを追加することもできます。 パレットを追加した場合には，そのパレットはこのメニューを通してユーザがアクセスできる省略時のパレットとなります( 他のパレットも今まで通り利用できます)。

### 6.3.1.2 色選択カラー・モデルを使用しての色の選択

Color Mixingウィジェットのコンテキストでは，現在の選択 という言葉は，ユーザがその色を変更したり別の色を選択する処理を実行しないかぎり， 新規の色として使用される色を意味します。

スペクトルのタイルまたは補間のタイルでユーザがMB1をクリックして離すと， その色が現在の選択になり，タイルが強調表示され，選択された色として示されます。

ユーザは選択した色をそのまま使用することも，次の処理のうちの1つ以上を実行することもできます。

- 補間を使用して，選択した色を好きな色に塗る(混ぜ合わせる) 。補間はユーザが特定の色(たとえば紫の色調)をすでに決めているが， 最終選択をする前に紫のさまざまな濃淡を見たい場合に特に役に立つ。

- 矢印ボタンを使用して，その色を明るくあるいは暗く，または暖かくあるいは寒く設定する。

- 別のカラー・モデルに切り替え，そのモデルの機能を使用して現在の選択を変更する。

### 6.3.1.3 補間の使用

2つのペイント・バケツを使用して，塗りたい1つまたは2つの色を補間に埋め込みます。 まず，ユーザがスペクトルのタイルまたは補間のタイル上でMB1 をクリックします。するとColor Displayウィジェットに，そのタイルの色が表示されます。 そしてペイント・バケツをクリックすると，その下にある補間のエンド・ タイル(端のタイル)に選択した色が埋め込まれます。 ユーザは補間の両方のエンド・タイルに埋め込むことも，片方だけに埋め込むこともできます。 片方だけに埋め込む場合，補間の空のエンド・ タイルの色は，省略時の設定により白になります。

ペイント・バケツの代わりに，ユーザは点眼器(Eyedropper)を使用して補間に埋め込むこともできます。 スペクトルまたは補間のタイル上でMB1を押したままにすると， もとの色のタイルまたは新規の色のタイルにより， ポインタはそのタイルの色が埋め込まれた点眼器になります。そして，この点眼器を補間に移動してMB1 を離すと，2つのエンド・タイルのうちの1 つに埋め込むことができます。点眼器が2つのエンド・タイルのいずれか一方の上に置かれてない場合は， 一番近いエンド・タイルが点眼器の色で埋められます。

補間のエンド・タイルが選択した色で埋められた後，「塗る」ボタンをアクティブ化すると， これら2つの色が直線補間されます。この補間の結果は中央の補間のタイルに表示されます。 表示されると，このプロセスで生成された新規の色を選択したり， 点眼器で取り出したり，塗ったりすることができます。

「暖かく」，「寒く」，「明るく」，「暗く」の各ボタンは，補間配列の各タイルを変更します。 「暖かく」ボタンは各タイルの色に赤を加え， 「寒く」ボタンは青を加えます。「明るく」と「暗く」のボタンは，各補間のタイルの明度の構成要素を変更します。

「取消」ボタンは，最後の補間処理を取り消すために使用します。この処理には， 色の混合，エンド・タイルの埋め込み，暖かさや明るさの調節ボタンのアクティブ化などがあります。

## 6.3.2 HLS配合カラー・モデル

HLS (Hue:色調，Lightness:明度，Saturation:彩度)配合カラー・モデルでは， 色は3つの特性，つまり色調，明度，彩度によって指定されます。 色調とは色あいのことです。明度は色の濃淡，すなわち色の量を示し，彩度は色の純度， つまりその色がどの程度白で薄められているかを示します。

HLSは円形に配列した値の連続的なスペクトルとして色調を表します。赤は0 度(そして360度)，マゼンダは60度，青は120度，シアンは180度，緑は240 度，黄色は300度です。色の明度すなわち濃淡は0から100パーセントの割合として表します。 明度が100パーセントは真っ白になり，0パーセントは黒になります。

HLS配合カラー・モデルをサポートするため，Color Mixerサブウィジェットには色調， 明度，彩度の範囲を表す3つのスケールが入っています。色調のスケールは色の値を0 から360までの範囲として表します。明度と彩度のスケールは0 から100までの割合の範囲として表します。

図 6-2は，HLS配合カラー・ モデルが選択されているColor Mixing ウィジェットの構成要素を示しています。

### 図 6-2 Color Mixingウィジェットの構成要素(HLS 配合カラー・モデル)

HLS配合カラー・モデルの変わっている点は，濃度の一番濃い色が50パーセントの明度で指定されることです。HLS 配合カラー・モデルは色の彩度， つまり純度も，0から100パーセントまでの割合としても表します。 100パーセントの彩度は純粋な色です。0パーセントの彩度は濁色です。

## 6.3.3 RGB配合カラー・モデル

RGB配合カラー・モデルはモノクロ・システムにおけるColor Mixingウィジェットの省略時のカラー・ モデルです。

RGB配合カラー・モデルでは，色は赤，緑，青のさまざまな濃淡を混ぜたものとして指定されます。X Window System バージョン11では，赤，緑， 青の濃淡を0から65,535までの値として指定します。0が一番低い濃度です。 黒は3つの色すべてについて濃度値0として定義され，白は3つの色すべてについて100 パーセントの濃度として定義されています。

図 6_2と図 6-3 のColor Mixingウィジェットは，各カラー・モデルにおいて"LightBlue" という色がどのように指定されるかを示しています。X Window Systemバージョン11は，LightBlueなど多数の「命名された」色をRGB 値によって指定します。

HLS配合カラー・モデルでは，LightBlueは色調スケール220，明度62パーセント， 彩度68パーセントとして指定されています。RGB配合カラー・モデルでは，LightBlue は赤の濃度24672，緑は35209，青は57825として指定されています。 図 6-3はColor Mixerサブウィジェットのスケールで， これらのX11のRGB値を割合として表す方法を示しています。

RGB配合カラー・モデルをサポートするため，Color Mixerサブウィジェットには赤， 緑，青の濃度の範囲を表す3つのスケールが入っています。各スケールはこれらの色の値を0 から100までの割合として表します。さらに，RGB 配合カラー・モデルをサポートする場合，Color Mixerサブウィジェットには， アプリケーションのユーザがRGB値をテキストとして直接入力できるText ウィジェットも入っています。Textウィジェットとスケールはリンクされており， 一方を変更するともう一方も変更されます。

図 6-3は，RGB配合カラー・ モデルが選択されているColor Mixing ウィジェットの構成要素を示しています。

### 図 6-3 Color Mixingウィジェットの構成要素(RGB 配合カラー・モデル)

## 6.3.4 色名指定カラー・モデル

色名指定カラー・モデルは，X11の命名された色のリストを表示するスクロール・ ウィンドウです。このウィンドウの各ボタンは，X11の色の名前を示しています。 十分な資源が利用できる場合，背景がその色に設定されます。 スクロール・バーを使用して，この色のリストをスクロールすることができます。 リスト内の色でMB1をクリックすると，Color Displayサブウィジェットがその色で埋められます。 色名指定カラー・モデルはすべてのシステム上で利用できます。

図 6-4は，カラー・モデルとして色名指定カラー・ モデルが選択されているColor Mixingウィジェットの構成要素を示しています。

### 図 6-4 Color Mixingウィジェットの構成要素( 色名指定カラー・モデル)

新規の色がそれ以上ほかのカラー・モデルによって変更されない場合，この色のX11 名も，カラーミックス・コールバック構造体の一部としてアプリケーションへ返されます。 このコールバックで，色名指定カラー・モデルは，RGB 値だけを返して名前のフィールドにはNULL値をもつ他のカラー・ モデルとは異なることに注意してください。

提供される色のリストを含むファイルの格納場所は，どのXサーバが使われているかに依存します。DEC UNIX システムでは，/usr/lib/X11/rgb.txt にDECwindowsの命名された色のリストが掲載されています。OpenVMSシステムでは， 『VMS DECwindows Guide to Xlib (Release 4) Programming: MIT C Binding』にDECwindows の命名された色のリストが掲載されています。WIndows NT 用にeXcursionを用いてアプリケーションを作成する場合は，どのXサーバを使用するかをeXcursion のドキュメントを参照してチェックしてください。 命名された色のRGB値は，すべてのサーバが実現している命名された色とかならずしもぴったり一致するわけではありません。 また，すべてのサーバがあらゆる命名された色をサポートするわけでもありません。

DXmNbrowserItemCountリソースは，色名指定カラー・モデルの色のリストで見えている項目の数を決定します。 このリソースはウィジェットの作成時にのみ設定できます。 省略時の値は5です。この数を増やすと，見えている各項目は， 追加のカラー・セルを割り当てるためにColor Mixingウィジェットを必要とします。

## 6.3.5 グレー・スケール・ミキサ

グレー・スケール・ミキサは，黒から白までの灰色の濃淡を生成するScale ウィジェットです。グレー・スケール・ミキサを選択すると，現在選択している色が適切な灰色に変換され， 変換後はScaleウィジェットを使用して調整することができます。 このモデルによって生成される灰色の濃淡はすべて， 赤，緑，青を等しい割合で混ぜ合わせたものであるため， これらの色はカラー・システムとグレー・スケール・システムの両方で同じように表示されます。

図 6-5は，グレー・スケール・ ミキサが選択されているColor Mixing ウィジェットの構成要素を示しています。

### 図 6-5 Color Mixingウィジェットの構成要素( グレー・スケール・ミキサ)

DXmNgreyscaleOnGreyscale論理値リソースは，TRUEの場合，グレー・スケール・ ミキシング・カラー・モデルをグレー・スケール・システム上の省略時の設定とします。 省略時の設定はTRUEです。グレー・スケール・ミキサはすべてのシステム上で利用できます。

# 6.4 Color Mixingウィジェットの構成要素

Color Mixingウィジェットは，サブウィジェットと呼ばれる子ウィジェットが入るようにあらかじめ構成されているダイアログ・ ボックスです。この機能は必ず実現する必要があります( ウィジェットの中に他のウィジェットが入っている場合， 中のウィジェットをサブウィジェットといいます) 。Color Mixingウィジェットには，次のサブウィジェットが入っています。

- スクラッチ・パッド-あとで色の混ぜ合わせに使用するための中間色を格納する。

- Color Displayサブウィジェット-もとの色および新規の色を表示する。

- Color Model Option Menuサブウィジェット-選択したカラー・ モデルを実現する。

- Color Mixerサブウィジェット-ユーザが新規の色を定義できるグラフィック・ ツールを提供する。

- Push Buttonサブウィジェット- Color Mixingウィジェットの各種機能をアクティブ化する。

- Labelサブウィジェット-記述情報を提供する。

- Work Areaサブウィジェット-アプリケーションによって定義された追加の機能を提供する( オプション)。

## 6.4.1 スクラッチ・パッド

スクラッチ・パッド・ダイアログ・ボックスを使用すると，ユーザはカラー・ モデル間で色を渡すことができます。たとえば，ユーザはスクラッチ・ パッドを使用して，色選択カラー・モデルで選択した一連の色を保管し， その後RGB配合カラー・モデルにおいて，それらの色に対応するRGB値を取得することができます。

スクラッチ・パッドを使用して，あとで色の混ぜ合わせに使用する中間色を格納することもできます。 たとえば，ユーザはスクラッチ・パッドを使用して5 種類の青の濃淡を格納したのち，格納されている濃淡から好みの濃度の色を選択することができます。

スクラッチ・パッドはすべてのカラー・モデルからアクセス可能です。図 6-6 はスクラッチ・パッドの構成要素を示しています。

### 図 6-6 スクラッチ・パッドの構成要素

ユーザはスクラッチ・パッド・カラー・タイルの上にあるペイント・バケツをクリックして， 現在選択されている色をスクラッチ・パッドに格納することができます。 スクラッチ・パッドはその色を，格納した色のリストに追加します。 ユーザは格納した色をスクロールすることができます。

注意
  色選択カラー・モデルの場合， 現在選択されている色は，モデル内のどのカラー・タイルからでも取り出せます。 ただし，ほかのカラー・モデルを使用している場合には，ニュー・ カラー・タイルまたはオリジナル・カラー・タイルからしか選択できません。

Color Displayサブウィジェットのニュー・カラー・タイルをスクラッチ・ パッドの色に設定するには，ユーザはその色へスクロールして，スクラッチ・ パッドのカラー・タイルをクリックします。するとニュー・カラー・ タイルが変わり，スクラッチ・パッドのタイルが強調表示されます。 色選択カラー・モデルではこの強調表示は，ユーザがペイント・バケツ・ ボタンを使用して，スクラッチ・パッドの色を補間のエンド・タイルの1 つに埋め込むことができることを示しています。

「消去」ボタンは格納されている色のリストをリセットし，スクラッチ・ パッドを初期状態に設定します。「取消」ボタンはスクラッチ・パッド・ ダイアログ・ボックスの内容を変更せずに，ウィジェットの管理を解除します。

## 6.4.2 Color Displayサブウィジェット

省略時のColor Displayサブウィジェットは，2つのWindowウィジェットが入っているDialog Box ウィジェット(作業領域スタイル)です。Windowウィジェットのうちの1 つはもとの色(オリジナル・カラー)の表示用であり， もう1つは新規の色(ニュー・カラー)の表示用です。New-Color Windowウィジェットに表示される色は， 新規の色が定義されると，その色を表示します。

Color Mixingウィジェットを作成するとき，もとの色と新規の色の両方の初期値を指定できます。 新規の色に初期値を指定しなければ，Color Mixingウィジェットはもとの色と一致するように新規の色を設定します。 DXmNmatchColorsリソースは論理値であり，TRUEの場合，Color Mixingウィジェットが初めて見えるようになるとき， ニュー・カラー・タイルをオリジナル・ カラー・タイルの色と一致させます。DXmNmatchColorsの省略時の設定はTRUE です。

Color Displayサブウィジェットの背景色を指定することもできます(省略時は灰色) 。

グレー・スケール装置に表示される場合，Color Displayサブウィジェットは色の値を灰色の濃淡として表します。Static Gray およびモノクロ装置上では，Color Disply サブウィジェットはColor Mixingウィジェット内に見えません。

省略時のColor Displayサブウィジェットを，自分が設計したウィジェットと置き換えることができます。 詳しくは第6.5.1項を参照してください。

## 6.4.3 Color Model Option Menuサブウィジェット

Color Model Option Menuサブウィジェットを使用すると，アプリケーションのユーザはColor Mixer サブウィジェットがサポートするカラー・ モデルを選択できます。(Color Mixerサブウィジェットについては第6.4.4項を参照)。 カラー・モデルは「オプション」のメニュー項目として表示されます。 ユーザはいつでもカラー・ モデルを切り換えることができます。

カラー・モデルを変更すると，Color Mixingウィジェットは現在の色の定義を保持し， 現在のカラー・モデルでその色を定義する値を，新しいカラー・ モデルでの適切な値へ変換します。

Color Model Option Menuサブウィジェットは，省略時のColor Mixerサブウィジェットを使用しているときだけ，Color Mixing ウィジェットに表示されます。

## 6.4.4 Color Mixerサブウィジェット

Color Mixerサブウィジェットは，ユーザが色を定義するために使用できるグラフィック・ ツールを提供します。ユーザがColor Mixerサブウィジェットの値を変更すると，Color Mixing ウィジェットは，Color Display サブウィジェットのニュー・カラー・ウィンドウに表示されている色をただちに更新します。

省略時の設定によるColor Mixerサブウィジェットは，色選択，HLS配合， RGB配合，色名指定，グレー・スケール・ミキサの各カラー・モデルをサポートします。DXmNcolorModel リソースに値を割り当てることによって， Color Mixerサブウィジェットが最初にサポートするカラー・モデルを指定できます。 カラー・モデルを指定しなければ，Color Mixerサブウィジェットの省略時の設定は， ディスプレイ装置のシステム・タイプによって決定されます。

DXmNcolorModelリソースにカラー・モデルを指定するには，表 6-1 にリストしている定数を使用してください。 表 6-1は，各カラー・モデルが省略時の設定として使用される場合についても説明しています。

### 表 6-1 カラー・モデルの定数

カラー・モデル | 定数 | 省略時
--- | --- | ---
色選択 | DXmColorModelPicker | カラー・システム
HLS配合 | DXmColorModelHLD | 省略時の設定として使用されない
RGB 配合 | DXmColorModelRGB | モノクロ・ システム
色名指定 | DXmColorModelBrowser | 省略時の設定として使用されない
グレー・スケール | DXmColorModelGreyscale | グレー・スケール・システム

色選択カラー・モデルはカラー以外のシステムには表示されません。 DXmNcolorModelリソースに色選択カラー・モデルを指定し，アプリケーションをカラー以外のシステムに表示すると，Color Mixer サブウィジェットはそのシステムの省略時のカラー・ モデルを使用します。

HLS配合，RGB配合，色名指定の各カラー・モデルとグレー・スケール・ミキサは， カラー，グレー・スケール，モノクロのシステム上に表示されます。 ただし，Color DisplayサブウィジェットはStatic Grayおよびモノクロ装置上では見えません。

省略時のColor Mixerサブウィジェットを自分が設計したウィジェットと置き換える方法については， 第6.5.2 項を参照してください。

## 6.4.5 Push Buttonサブウィジェット

省略時の設定により，Color Mixingウィジェットには「了解」，「適用」， 「リセット」，「取消」，「ヘルプ」というラベルのついた5つのPush Button サブウィジェットが入っています。「了解」，「適用」， 「取消」の各プッシュ・ボタンをアクティブ化すると，Color Mixingウィジェットはアプリケーションへのコールバックを実行します。

注意
  「リセット」および「ヘルプ」の各プッシュ・ ボタンはColor Mixingウィジェット内部の組み込み機能を持つため， アプリケーションへのコールバックを実行しません。

「リセット」ボタンをアクティブ化すると，Color Mixerサブウィジェットの値と，Color Display サブウィジェットのニュー・カラー・ウィンドウに表示されている色を， 初期値に戻します。「ヘルプ」ボタンはColor Mixingウィジェットの使用に関するヘルプを表示します。

プログラマがColor Mixingウィジェットの各プッシュ・ボタンに関連付けられた機能を実現します。 『OSF/Motifスタイル・ガイド』には，「了解」，「適用」， 「取消」といったラベルのついているプッシュ・ボタンに，どのような機能を関連付けるべきかについての勧告が記載されています。 次に， Color Mixingウィジェットに各種機能を実現する際の勧告を示します。

- 「了解」プッシュ・ボタンは新規に定義された色をアプリケーションに表示した後， ディスプレイからColor Mixingウィジェットを取り除きます。

- 「適用」プッシュ・ボタンは新規に定義された色をアプリケーションに表示しながら， ディスプレイ上にColor Mixingウィジェットをアクティブなまま残します。

- 「取消」プッシュ・ボタンはユーザが行った変更をいずれも実現せず， ディスプレイからColor Mixingウィジェットを取り除きます。

これらのプッシュ・ボタンに関連付けたい機能を実現するには，コールバック・ ルーチンを使用してください。これらのコールバック・ルーチンは，Color Mixing ウィジェットのコールバック・リソースと関連付けます。 たとえば，ある機能を「了解」プッシュ・ボタンに関連付けるには，XmNactivateCallback リソースを使用します。コールバック・ルーチンとColor Mixing ウィジェットの関連付けについての詳しい説明は，第6.6節を参照してください。

Push Buttonサブウィジェットに表示されるテキストは変更できます(詳しい説明は 第6.4.9.3項を参照)。また， テキスト・ ラベルにNULL値を指定すると，どのPush Buttonサブウィジェットでも取り除くことができます。

## 6.4.6 Labelサブウィジェット

Color Mixingウィジェットには十数個のラベルが入っています。このラベルを使用すると，Color Mixing ウィジェットの構成要素に記述テキストを与えることができます。 これらのラベルにテキストを指定する方法については， 第6.4.9.3項で説明します。

## 6.4.7 Work Areaサブウィジェット

アプリケーションがWork Areaサブウィジェットを提供する場合は，Color MixingウィジェットにWork Areaサブウィジェットを含むことができます。Color Mixing ウィジェットはこのサブウィジェットを管理し，Color Mixerサブウィジェットの下，Push Buttonサブウィジェットの上に配置します。

Work Areaサブウィジェットは，Label，Push Button，Dialog Boxウィジェットなど， ほかのツールキットのウィジェットならどれでもかまいません。Dialog Box ウィジェットを使用する場合は，このウィジェットの作業領域スタイルだけを使用してください。

たとえば，アプリケーションはこの追加サブウィジェットを使用して，追加のPush Button ウィジェットを組み込み，Color Mixingウィジェットの機能を拡張することができます。

## 6.4.8 新規の色の値の設定と検索

アプリケーションが省略時のColor Displayサブウィジェットを使用しない場合， プログラマはColor Displayサブウィジェットに表示されている新規の色のRGB 値を設定したり検索する必要があります。XtSetValuesおよびXtgetValues の各Intrinsicsルーチンを使用すると，これを行なうことができます。 ただし，DECwindows Motifツールキットは，これらのタスクをもっと速く実行できる支援ルーチンを用意しています。

DXmNnewRedValue，DXmNnewGreenValue，DXmNnewBlueValueの各リソースの値を設定するには，DXmColorMixSetNewColor 支援ルーチンを使用してくだい。 これらのリソースの値は，そのルーチンへの引数として指定します。 省略時のColor Displayサブウィジェットは，ニュー・カラー・ウィンドウを更新して新規に定義された色を表示します。

各ニュー・カラー・リソースの値を検索するには， DXmColorMixGetNewColor支援ルーチンを使用してください。この支援ルーチンはDXmNnewRedValue, DXmNnewGreenValue ，DXmNnewBlueValueの各リソースの現在値を， 引数としてルーチンに渡す変数に書き込みます。

表 6-2は，Color Mixingウィジェットに関する支援ルーチンをまとめた表です。

### 表 6-2 Color Mixingウィジェットの支援ルーチン

ルーチン | 説明
--- | ---
DXmColorMixGetNewColor | ニュー・カラー・ リソースの現在値を検索する。
DXmColorMixSetNewColor | ニュー・カラー・リソースに値を割り当てる。

## 6.4.9 Color Mixingウィジェットの変更

Color Mixingウィジェットの見た目と機能のうち，次の項目を変更することができます。

- サイズ

- マージン

- ラベル

- 背景色

- Work Areaサブウィジェット

### 6.4.9.1 サイズの指定

Color Mixingウィジェットは，含んでいるサブウィジェットに適合するように， 自分自身のサイズを設定します。たとえば，プログラマがLabelサブウィジェットの値として長いコンパウンド・ ストリングを指定すると， Color Mixingウィジェットはそのラベルを収容できるように自分のサイズを大きくします。 省略時のサイズを取得するために，共通のウィジェット・ リソースXmNwidthとXmNheightを0 (ゼロ)に設定する必要はありません。

省略時のColor Displayサブウィジェットでは，もとの色と新規の色を表示するウィンドウのサイズを指定できます。 省略時の設定では， これら各ウィンドウは80ピクセルの四角形です。このウィンドウの寸法を指定するには，DXmNdisplayColWinWidth リソースおよびDXmNdisplayColWinHeight リソースを使用します。寸法はピクセルで指定してください。 これらのリソースは省略時のColor Displayサブウィジェットだけに作用します。

DXmNpickerTileHeight -色選択カラー・モデルのスペクトルのタイルの高さをピクセルで指定する。 省略時の値は30ピクセル。

DXmNpickerTileWidth -色選択カラー・モデルのスペクトルのタイルの幅をピクセルで指定する。 省略時の値は30ピクセル。

DXmNinterpTileHeight -色選択カラー・モデルの補間のタイルの高さをピクセルで指定する。 省略時の値は30ピクセル。

DXmNinterpTileWidth -色選択カラー・モデルの補間のタイルの幅をピクセルで指定する。 省略時の値は30ピクセル。

### 6.4.9.2 マージンの指定

Color Mixingウィジェットに含まれているサブウィジェットの回りのマージンの量を指定することができます。 各サブウィジェットの左辺と右辺の間のマージン量を指定するには， 共通のウィジェット・リソースXmNmarginWidth を使用してください(省略時の値は10ピクセル)。また， 上辺と下辺の間のマージン量を指定するには，共通のウィジェット・リソースXmNmarginHeight を使用してください(省略時の値は10ピクセル)。マージンはピクセルで指定します。

さらに，省略時のDisplayサブウィジェットにおいて，2つのWindowウィジェットの回りのマージン量を指定することもできます。Display サブウィジェットにおけるすべてのマージンのサイズを指定するには，DXmNdispWinMargin リソースを使用してください(省略時の値は20 ピクセル)。DXmNdispWinMarginリソースは省略時のColor Displayサブウィジェットだけに作用します。

### 6.4.9.3 Color Mixingウィジェットのラベル付け

Color Mixingウィジェットのラベル・リソースに値を割り当てることにより，Color Mixing ウィジェットに含まれる各ラベルにテキストを指定することができます。 これに関しては，『日本語DECwindows Motif for OpenVMS拡張機能説明書』(日本語) ，『DECwindows Extensions to Motif』(英語)に説明があります。 これらのラベルはコンパウンド・ストリングとして指定しなければなりません。

たとえば，DXmNmainLabelリソースはColor Mixingウィジェットの一番上に， センタリングされて表示されるテキストを指定します。次のUILコードはDXmNmainLabel リソースの値を"Colormix Example"に設定します。

         object main_color : DXmColorMixDialog
                     {
                     arguments
                         {
                         XmNdialogTitle  = "DECburger: Background Color";
                         DXmNmainLabel = compound_string("Colormix Example");
                         };

                     callbacks
                         {
                         XmNhelpCallback =  procedure sens_help_proc(k_options_help);
                         XmNcancelCallback = procedure cancel_color_proc();
                         XmNokCallback =  procedure ok_color_proc();
                         XmNapplyCallback = procedure apply_color_proc();
                         };
                    };

DXmNmainLabel，DXmNdisplayLabel，DXmNmixerLabelのいずれかのリソースに値を指定しなければ，Color Mixing ウィジェットはこれらのLabelサブウィジェットを組み込みません。XmNokLabelString ，XmNapplyLabelString, DXmNresetLabelString，XmNcancelLabelStringのいずれかのリソースにNULL 値を指定すると，Color MixingウィジェットはPush Buttonサブウィジェットを削除します。

Color Mixerサブウィジェットにテキスト・ラベルを指定するリソースは， 省略時のColor Mixerサブウィジェットでのみ作用することに注意してください。

### 6.4.9.4 Color Displayサブウィジェットの背景色の定義

Displayサブウィジェットの背景色を定義するには， DXmNbackRedValue，DXmNbackGreenValue，DXmNbackBlueValueリソースを使用してください。 これらのリソースは省略時のColor Displayサブウィジェットでのみ作用します。

### 6.4.9.5 Color Mixingウィジェットへの作業領域の追加

Color MixingウィジェットにWork Areaサブウィジェットを組み込むように指定するには， サブウィジェットにしたいウィジェットを作成し，ウィジェット識別子をXmNworkWindow リソースの値として割り当てます。

Work Areaサブウィジェットを管理する必要はありません。

### 6.4.9.6 色選択カラー・モデルの変更

表 6-3で説明しているリソースを使用すば， 色選択カラー・モデルを変更できます。

### 表 6-3 色選択カラー・モデルの変更

リソース名 | 説明
--- | ---
DXmNpickerColors | ユーザ・パレット・メニュー・オプションを通して利用できる10 色のパレット。ユーザ・パレットは，指定しなければメニューに表示されない。 ユーザ・パレットを指定すると，そのパレットはこのメニューを通してユーザがアクセスできる省略時のパレットとなる( ほかのパレットもそのまま利用可能)。 DXmNpickerColorsは10色を，白，赤，オレンジ，黄，緑，青，青紫，紫， 茶，黒の順に配列したものである。配列における最初の項目は最初のスペクトル・ タイルの赤の値で，2番めの項目は緑の値，3番めの項目は青の値，4 番めの項目は2番めのタイルの赤の値，というように続く。 省略時の設定では色が10色あり，各色が赤，緑，青の値をもっているため，DXmNpickerColors は30の省略時の値をもつ。 DXmNpickerColorsは作成時にのみ設定できる。
DXmNinterpTileCount | 使用する補間のタイルの数。 省略時の値は10。DXmNinterpTileCountは作成時にのみ設定できる。
DXmNwarmthIncrement | 「暖かく」または「寒く」ボタンが押されたとき，各補間のタイルの色に追加される赤または青の量。 省略時の値は5000。
DXmNlightnessIncrement | 「明るく」または「暗く」ボタンが押されたとき， 各補間のタイルの色の明度が増減する割合。 省略時の値は5パーセント。

# 6.5 他のカラー・モデルのサポート

Color Mixingウィジェットを拡張して，省略時のColor MixerサブウィジェットとColor Display サブウィジェットを，自分が設計したウィジェットに置き換ることにより， ほかのカラー・モデルをサポートすることができます。 これらのサブウィジェットを置き換える方法については， 第6.5.1項と第6.5.2項で説明します。

どのカラー・システムをサポートする場合でも，X Window Systemバージョン11 はRGB値で色を定義します。プログラマの個人的なサブウィジェットは， そのサブウィジェットが受け取る値をすべてRGB値に変換して，そのRGB 値をColor Mixingウィジェットに提供しなければなりません。すると，Color Mixing ウィジェットはコールバック・データとしてアプリケーションにその値を返します（OpenVMS でのカラー・リソースの取得，および別のカラー・ モデルからRGBへ色の値を変換する例については，『VMS DECwindows Xlib Programming Volume』にあるカラー使用のサンプル・プログラムを参照してください) 。

## 6.5.1 Color Displayサブウィジェットの置き換え

省略時のColor Displayサブウィジェットを置き換えるには，新しいColor Displayサブウィジェットの識別子をDXmNdisplayWindowリソースの値として指定します。 このリソースの値を指定しなければ，Color Mixingウィジェットは省略時のColor Display サブウィジェットを使用します。

Color Mixingウィジェットを作成するときには，省略時のColor Display サブウィジェットを置き換える指定ができないことに注意してください。 つまり，まずColor Mixingウィジェットを作成(管理はしない)してから， XtSetArgとXtSetValuesを使用してDXmNdisplayWindowリソースに値を指定しなければなりません。

したがって，省略時のColor Displayサブウィジェットを置き換えるには， 次の操作を実行します。

1. DXmNdisplayWindowリソースを指定せずにColormixウィジェットを作成する。

2. プログラマの個人的なColor Displayサブウィジェットを作成する。 親としてColormixウィジェットを指定する。

3. XtSetArgおよびXtSetValuesを使用して新しい値を設定する。

4. Color Mixingウィジェットを管理する。

DXmNdisplayWindowリソースをNULLに設定することにより，いつでも省略時のColor Display サブウィジェットに戻ることができます。

省略時のColor Displayサブウィジェットを置き換える場合には，ユーザがColor Mixer ウィジェットを変更したときにニュー・カラー・ウィンドウを更新するプロシージャを与えなければなりません。Color Mixing ウィジェットは，ユーザがColor Mixerサブウィジェットの値を変更すると， 必ずこのルーチンを呼び出します。このルーチンのアドレスをDXmNsetNewColorProc リソースの値として渡してください。

DXmNsetNewColorProcリソースの省略時の値は，ニュー・カラー・ウィンドウを更新するルーチンです。 アプリケーションがDXmNsetNewColorProc ルーチンを備えている場合には，アプリケーションで省略時のColor Displayサブウィジェットを置き換えなくても，このルーチンが使用されます。

## 6.5.2 Color Mixerサブウィジェットの置き換え

省略時のColor Mixerサブウィジェットを自分が設計したサブウィジェットと置き換えるには， 新しいサブウィジェットのウィジェット識別子をDXmNmixerWindow リソースの値として割り当てます。このリソースの値を指定しなければ，Color Mixing ウィジェットは省略時のColor Mixerサブウィジェットを使用します。

Color Mixingウィジェットを作成するときには，省略時のColor Mixerサブウィジェットを置き換える指定ができないことに注意してください。 つまり， まずColor Mixingウィジェットを作成(管理はしない)してから， XtSetArgとXtSetValuesを使用してDXmNmixerWindowリソースの値を指定しなければなりません。

したがって，省略時のColor Mixingサブウィジェットを置き換えるには， 次の操作を実行します。

1. DXmNmixerWindowリソースを指定せずにColormixウィジェットを作成する。

2. プログラマの個人的なColor Mixerサブウィジェットを作成する。Colormix ウィジェットを親として指定する。

3. XtSetArgとXtSetValuesを使用して新しい値を設定する。

4. Color Mixingウィジェットを管理する。

DXmNmixerWindowリソースをNULLに設定することにより，いつでも省略時のColor Mixer サブウィジェットに戻ることができます。

DXmNsetMixerColorProcリソースは，ミキシング・モデルの直接的な操作( 「リセット」ボタンを押すことなど)以外の方法で，新規の色が更新されると呼び出されるプロシージャを指定します。 このプロシージャは，新規の色の値と一致するようにRGB 配合またはHLS配合カラー・モデルにスライダを設定するなど， 現在のミキシング・モデルに必要な変更を行います。 DXmNsetMixerColorProcは通常，アプリケーションが独自のカラー・ミキシング・ モデルを備えて，省略時のミキサを利用しない場合に使用します。

# 6.6 コールバックとColor Mixingウィジェットの関連付け

ユーザが「了解」，「適用」，「取消」のいずれかのプッシュ・ボタンを押すと，Color Mixing ウィジェットはアプリケーションへのコールバックを実行します。 ただし，「リセット」または「ヘルプ」ボタンをアクティブ化しても， コールバックを呼び出すことはありません。

Color Mixingウィジェットがコールバックを実行すると， そのウィジェットはアプリケーションに，もとの色を定義するRGB 値(DXmNorigRedValue，DXmNorigGreenValue, DXmNorigBlueValueの各リソースで指定)と新規の色を定義するRGB値(DXmNnewRedValue ，DXmNnewGreenValue, DXmNnewBlueValueの各リソースで指定) を含むデータを返します。

コールバック時にColor Mixingウィジェットによって返されるデータについての詳しい説明は， 『日本語DECwindows Motif for OpenVMS 拡張機能説明書』(日本語)，『DECwindows Extensions to Motif』(英語)を参照してください。

カラー・ミキシング・コールバックは，ユーザが色名指定カラー・モデルを選択した場合， 命名された色のアプリケーションへの引き渡しもサポートします。 ユーザが色名指定カラー・モデルから命名された色を選択し， 新規の色を変更しないでアプリケーションへのコールバックを呼び出すと， コールバック・データ構造体のnewnameフィールドに，その色のX11 名を含み，ASCIIのNULLで終了する文字列へのポインタが設定されます。 この文字列は読み込み専用であって，解放したり変更してはなりません。

色をほかのカラー・モデルで生成したり，色名指定カラー・モデルで生成した後変更すると， コールバック構造体のnewnameフィールドはNULL に設定されます。

例 6-1はDXmColorMixCallbackStruct データ構造体のフォーマットを示しています。

### 例 6-1 DXmColorMixCallbackStructデータ構造体

    typedef struct
    {
      int             reason;
      XEvent          *event;
      unsigned short  newred;
      unsigned short  newgrn;
      unsigned short  newblu;
      char            *newname;
      unsigned short  origred;
      unsigned short  origgrn;
      unsigned short  origblu;
    } DXmColorMixCallbackStruct;

コールバック・ルーチンとColor Mixingウィジェットのコールバックを関連付けるには， コールバック・ルーチン・リストをColor Mixingウィジェットのコールバック・ リソースの1つに渡します。表 6-4にコールバック・ リソースをリストするとともに，これらのコールバックを呼び出す条件を示します。

### 表 6-4 Color Mixingウィジェットのコールバック

コールバック・リソース | コールバックの条件
--- | ---
XmNokCallback | ユーザがColor Mixing ウィジェットで「了解」Push Buttonウィジェットをクリックした。
XmNapplyCallback | ユーザがColor Mixingウィジェットで「適用」Push Button ウィジェットをクリックした。
XmNcancelCallback | ユーザがColor Mixingウィジェットで「取消」Push Button ウィジェットをクリックした。

# 6.7 Color Mixingウィジェットの作成

Color Mixingウィジェットを作成するには，次の手順に従ってください。

1. 表 6-5のいずれかのウィジェット作成のための方法で，Color Mixing ウィジェットを作成する。

2. IntrinsicsルーチンXtManageChildを使用して，Color Mixing ウィジェットを管理する。

上記の手順が終了したら，Color Mixingウィジェットの親がすでに実現されている場合， ディスプレイにColor Mixingウィジェットが表示されます。

### 表 6-5 Color Mixingウィジェットの作成方法

方法 | ルーチン名またはオブジェクト・タイプ
--- | ---
ツールキット・ルーチン | DXmCreateColorMixDialogルーチンを使用して，ポップアップ・ ダイアログ・ボックスにColor Mixingウィジェットを作成する。
ツールキット・ルーチン | DXmCreateColorMixルーチンを使用して，ダイアログ・ボックスにColor Mixing ウィジェットを作成する。このルーチンを使用して，Color Mixingウィジェットを既存のウィジェットの1つに追加することもできる。Color Mixing ウィジェットのこのバージョンを使用すると，次の2つの副作用がある。 カラー資源はウィジェットが破壊されるまで解放されない(このウィジェットのポップアップ・ バージョンは，その管理が解除されると資源を解放し， アプリケーションがColorウィジェットを作成してから破壊し， その後再作成しなくてもよいようにする)。 グレー・スケール・ミキサのScaleウィジェットが変更される。
UILオブジェクト・タイプ | UILオブジェクト・タイプDXmColorDialogを使用して，ポップアップ・ ダイアログ・ボックスにColor Mixingウィジェットを定義する。実行時，MrmFetchWidget ルーチンがこの定義に従ってウィジェットを作成する。
UILオブジェクト・タイプ | UILオブジェクト・タイプDXmColorを使用して，ダイアログ・ボックスにColor Mixing ウィジェットを定義する。実行時，MrmFetchWidgetルーチンがこの定義に従ってウィジェットを作成する。DXmCreateColorMix について述べた副作用はDXmColor にもあてはまる。

## 6.7.1 Color Mixingウィジェットの作成- UILの例

例 6-2はDECburgerサンプル・ プログラムで使用される， 「オプション」メニュー項目とColor Mixingウィジェットを作成します。 この例は，省略時のColor Displayサブウィジェットと省略時のColor Mixer サブウィジェットを使用するColor Mixingウィジェットを定義します。

### 例 6-2 Color Mixingウィジェットの作成- UIL の例

       .
       .
       .

    ! The options pulldown entry and its associated pulldown menu.

    object
        options_menu_entry : XmCascadeButton {
            arguments {
                  XmNlabelString = k_options_label_text;
                    XmNmnemonic = keysym("O");
               【1】XmNmappedWhenManaged = false;
            };
             controls {
                XmPulldownMenu options_menu;
            };
            callbacks {
                MrmNcreateCallback = procedure create_proc (k_options_pdme);
                XmNhelpCallback = procedure sens_help_proc(k_options_help);
            };
        };
    【2】
    object
        options_menu : XmPulldownMenu {
            controls {
                XmPushButton m_options_control_button;
                };
            callbacks {
                MrmNcreateCallback = procedure create_proc (k_options_menu);
                XmNhelpCallback = procedure sens_help_proc(k_options_help);
           };
        };
    【3】
    object
        m_options_control_button : XmPushButton {

            arguments
                    {
                    XmNlabelString = k_options_color_label_text;
                    XmNmnemonic = keysym("C");

                    };
            callbacks {
                MrmNcreateCallback = procedure create_proc (k_create_options);
                XmNactivateCallback = procedure activate_proc (k_create_options);
                XmNhelpCallback = procedure sens_help_proc(k_options_help);
            };
        };
    【4】
    object main_color : DXmColorMixDialog
                {
                arguments
                    {
                    XmNdialogTitle  = "DECburger: Background Color";
                    DXmNmainLabel = compound_string("Colormix Example");
                    };

           【5】callbacks
                    {
                    XmNhelpCallback =  procedure sens_help_proc(k_options_help);
                    XmNcancelCallback = procedure cancel_color_proc();
                    XmNokCallback =  procedure ok_color_proc();
                    XmNapplyCallback = procedure apply_color_proc();
                    };
               };
       .
       .
       .

1. このオブジェクト宣言はoptions_menu_entryという名前のカスケード・ ボタンを定義します。DECburgerはカラー・ システム上でのみ「オプション」メニュー項目を使用するため，XmNmappedWhenManaged リソースはfalseに設定されています。

2. このオブジェクト宣言はoptions_menuという名前のプルダウン・ メニューを定義します。

3. options_menuプルダウン・メニューは「背景色」プッシュ・ボタンを制御します。 このプッシュ・ボタンのアクティベート・コールバックの結果として，create_color ルーチンが呼び出されます。

4. このオブジェクト宣言はmain_colorという名前のPop-Up Color Mixingウィジェットを定義します。このColor MixingウィジェットのUIL キーワードはDXmColorMixDialogです。

5. UILオブジェクト宣言のコールバック・リスト・セクションは，Color Mixing ウィジェットによって実行される1次コールバックのそれぞれに値を割り当てます。

例 6-3は，このUILモジュールに関連するC ソース・コードを示しています。

### 例 6-3 UILを使用してColor Mixingウィジェットを作成するためのC ソース・コード

       .
       .
       .
    【1】
    #include <DXm/DXmColor.h>
       .
       .
       .
    /*
     * Global data
     */

    static Cursor watch = NULL;

    static Widget
        toplevel_widget = (Widget)NULL,     /* Root widget ID of our application. */
        main_window_widget = (Widget)NULL,  /* Root widget ID of main MRM fetch   */
        widget_array[MAX_WIDGETS],          /* Place to keep all other widget IDs */
        main_help_widget = (Widget)NULL,    /* Primary help widget           */
        help_widget[MAX_WIDGETS],           /* Array of help widgets         */
        print_widget = (Widget)NULL,        /* Print widget                  */
    【2】color_widget = (Widget)NULL;        /* Color Mix widget          */

    static Screen   *the_screen;            /* Pointer to screen data*/
    static Display  *the_display;           /* Pointer to display data */
    【3】
    static XColor  savecolor;

       .
       .
       .
    /*
     * Forward declarations
     */

    static void s_error();
    static void get_something();
    static void set_something();

    static void activate_proc();
    static void create_proc();
    static void list_proc();
    static void exit_proc();
    static void pull_proc();
    static void scale_proc();
    static void show_hide_proc();
    static void show_label_proc();
    static void toggle_proc();
    static void create_help();
    static void tracking_help();
    static void sens_help_proc();
    static void help_system_proc();
    static void create_print();
    static void activate_print();
    【4】
    static void create_color();
    static void ok_color_proc();
    static void apply_color_proc();
    static void cancel_color_proc();
    static void xmstring_append();
    static void start_watch();
    static void stop_watch();
       .
       .
       .

    /* The names and addresses of things that Mrm.has to bind.  The names do
     * not have to be in alphabetical order.  */

    static MrmRegisterArg reglist[] = {
        {"activate_proc", (caddr_t) activate_proc},
        {"create_proc", (caddr_t) create_proc},
        {"list_proc", (caddr_t) list_proc},
        {"pull_proc", (caddr_t) pull_proc},
        {"exit_proc", (caddr_t) exit_proc},
        {"scale_proc", (caddr_t) scale_proc},
        {"show_hide_proc", (caddr_t) show_hide_proc},
        {"show_label_proc", (caddr_t) show_label_proc},
        {"toggle_proc", (caddr_t) toggle_proc},
        {"sens_help_proc", (caddr_t) sens_help_proc},
        {"help_system_proc", (caddr_t) help_system_proc},
        {"cancel_color_proc", (caddr_t) cancel_color_proc},
        {"apply_color_proc", (caddr_t) apply_color_proc},
        {"ok_color_proc", (caddr_t) ok_color_proc}
    };

       .
       .
       .

        /* If it's a color display, map customize color menu entry */

       【5】if ((XDefaultVisualOfScreen(the_screen))->class == TrueColor
            ||  (XDefaultVisualOfScreen(the_screen))->class == PseudoColor
            ||  (XDefaultVisualOfScreen(the_screen))->class == DirectColor
            ||  (XDefaultVisualOfScreen(the_screen))->class == StaticColor)

          【6】XtSetMappedWhenManaged(widget_array[k_options_pdme], TRUE);

       .
       .
       .

    /*
     * One-time initialization of application data structures.
     */

    static int init_application()
    {
        int k;
        int i;

        /* Initialize the application data structures. */
        for (k = 0; k < MAX_WIDGETS; k++)
            widget_array[k] = NULL;
        for (k = 0; k < NUM_BOOLEAN; k++)
            toggle_array[k] = FALSE;

        /* Initialize CS help widgets. */

        for (i = 0; i < MAX_WIDGETS; i++)
            help_widget[i] = NULL;

        /* Initialize print widgets. */

        print_widget = NULL;

        /* Initialize color mix widget. */

    【7】color_widget = NULL;

       .
       .
       .
    /*
     * All push buttons in this application call back to this routine.  We
     * use the tag to tell us what widget it is, then react accordingly.
     */

    static void activate_proc(w, tag, reason)
        Widget               w;
        int                  *tag;
        XmAnyCallbackStruct  *reason;
    {
        int         widget_num = *tag;       /* Convert tag to widget number. */
        int         i, value;
        XmString    topic;

        switch (widget_num) {
        case k_nyi:

                /* The user activated a 'not yet implemented' push button.  Send
                 * the user a message. */
                if (widget_array[k_nyi] == NULL) {
                     /* The first time, fetch from  the data base. */
                    if (MrmFetchWidget(s_MrmHierarchy, "nyi", toplevel_widget,
                      &widget_array[k_nyi], &dummy_class) != MrmSUCCESS) {
                        s_error("can't fetch nyi widget");
                    }
                }
                /*  Put up the message box saying 'not yet implemented'. */
                XtManageChild(widget_array[k_nyi]);
                break;

       .
       .
       .
        【8】case k_create_options:
                create_color();
                break;

             default:
                break;
        }
    }

       .
       .
       .

    /* Color Mixing Widget Creation */

    static void create_color()
    {

      XColor              newcolor;
      unsigned int        ac;
      Arg                 arglist[10];

         start_watch();

    【9】if (!color_widget) {

            if (MrmFetchWidget (s_MrmHierarchy, "main_color", toplevel_widget,
                                &color_widget, &dummy_class) != MrmSUCCESS)
            s_error ("can't fetch color mix widget");

      【10】XtSetArg(arglist[0], XmNbackground, &newcolor.pixel);
            XtGetValues(main_window_widget, arglist, 1);

      【11】XQueryColor(the_display,
                       XDefaultColormapOfScreen(the_screen), &newcolor);

      【12】ac = 0;
            XtSetArg (arglist[ac], DXmNorigRedValue, newcolor.red); ac++;
            XtSetArg (arglist[ac], DXmNorigGreenValue, newcolor.green); ac++;
            XtSetArg (arglist[ac], DXmNorigBlueValue, newcolor.blue); ac++;
            XtSetValues(color_widget, arglist, ac);

      【13】savecolor.red = newcolor.red;
            savecolor.green = newcolor.green;
            savecolor.blue = newcolor.blue;
            savecolor.pixel = newcolor.pixel;

        } else {

      【14】XtSetArg(arglist[0], XmNbackground, &savecolor.pixel);
            XtGetValues(main_window_widget, arglist, 1);

            XQueryColor(the_display,
                        XDefaultColormapOfScreen(the_screen), &savecolor);
        }

    【15】XtManageChild(color_widget);
        stop_watch();
    }

       .
       .
       .

1. Color Mixingウィジェットのリソース・ファイルを取り込みます。

2. Color Mixingウィジェットは，モジュール内の複数のルーチンによって参照されるため， グローバル・データ・セクションで宣言します。

3. savecolorのXColorデータ構造体は，モジュール内の複数のルーチンによって参照されるため， グローバル・データ・セクションで宣言します。

4. 宣言をカラー・ミキシング・ルーチンへ転送します。

   ユーザが「了解」，「適用」，「取消」のいずれかのプッシュ・ボタンを押すと，Color Mixing ウィジェットはアプリケーションへのコールバックを実行します。 了解，適用，取消のコールバック・ルーチンは， このために用意されています。

5. DECburgerがカラー・システム上に表示されているかどうか調べます。DECburger はカラー・システムの場合にのみ，背景色変更機能を実現します。

6. DECburgerがカラー・システム上で表示されている場合，管理するとマップされるように「オプション」カスケード・ ボタンを設定します。

7. Color MixingウィジェットがNULLで始まるようにします。 create_colorルーチンはColor Mixingウィジェットが存在するかどうかを調べます。 ウィジェットをNULLに初期化すると，誤ったデータが入りません。

8. create_colorルーチンが「背景色」プッシュ・ボタンのアクティベート・ コールバックの結果として呼び出されます。

9. Color Mixingウィジェットがまだ存在しない場合，それをフェッチします。

10. Color Mixingウィジェットが初めて管理されるとき，Color Displayサブウィジェットのもとの色は，変更するオブジェクト(この場合はMain Window ウィジェット)の色と一致しなければなしません。 このため，この例はXtSetArgおよびXtGetValuesのIntrinsicsルーチンを呼び出して，Main Window ウィジェットの背景色を取得し，それを newcolor.pixelフィールドに格納します。

11. 次に，この例はXlib XQueryColorルーチンを呼び出して， newcolor.pixelのピクセル値に関連するRGB値を取得します。XQueryColor ルーチンはnewcolorデータ構造体のred， green，blueの各フィールドに値を設定します。

    このように実現すると，アプリケーションは実行時に，Color Display サブウィジェットの初期の色を決定できます。

    注意
      UILからDXmNorigRedValue， DXmNorigGreenValue，DXmNorigBlueValueの各リソースを設定する唯一の方法は， 設定したいRGB値を直接コーディングすることです。

      このようにコーディングされたRGB値は，変更されるオブジェクトの実際の色と一致するという保証がないため， この方法はお勧めしません。

12. XtSetArgおよびXtSetValuesルーチンを呼び出して，Color Mixingウィジェットにもとの色を設定します。

13. Main WindowウィジェットのもとのXmNbackgroundの色を保管して， あとで復元できるようにしておきます。

14. Color Mixingウィジェットがすでに存在する場合には， Main Windowウィジェットの現在のXmNbackgroundピクセル値を取得し，XQueryColor を呼び出して関連するRGB値を取得します。 savecolor.red，savecolor.green，savecolor.blueの各フィールドはRGB 値を格納して，あとで復元できるようにしておきます。

15. Color Mixingウィジェットを管理します。Color Mixingウィジェットのコールバックは， 必要に応じてColor Mixingウィジェットを更新します。

## 6.7.2 Color Mixingウィジェット-「了解」コールバック

DECburgerの「了解」コールバック・ルーチンを例 6-4 に示します。

### 例 6-4 Color Mixingウィジェット-「了解」コールバック

       .
       .
       .
    /* Color Mix OK Callback */
    【1】
    static void ok_color_proc(widget_id, tag, reason)
       Widget                     widget_id;
       int                        *tag;
       DXmColorMixCallbackStruct  *reason;
    {

       int         ac;
       Arg         arglist[10];
       XColor      newcolor;

    【2】newcolor.red = reason->newred;
       newcolor.green = reason->newgrn;
       newcolor.blue = reason->newblu;

    【3】if (XAllocColor(the_display,
                      XDefaultColormapOfScreen(the_screen), &newcolor)) {

      【4】ac = 0;
           XtSetArg (arglist[ac], XmNbackground, newcolor.pixel);ac++;
           XtSetValues(widget_array[k_total_order], arglist, ac);
           XtSetValues(main_window_widget, arglist, ac);
       }

       else
            s_error ("can't allocate color cell");

       XtUnmanageChild(color_widget);

       ac = 0;
       XtSetArg (arglist[ac], DXmNorigRedValue, newcolor.red);ac++;
       XtSetArg (arglist[ac], DXmNorigGreenValue, newcolor.green);ac++;
       XtSetArg (arglist[ac], DXmNorigBlueValue, newcolor.blue);ac++;
       XtSetValues(color_widget, arglist, ac);

    }

       .
       .
       .

1. ユーザが「了解」プッシュ・ボタンを押すと，ok_colorコールバック・ ルーチンが呼び出されます。

2. newcolorデータ構造体のred，green，blueの各メンバが， ユーザによって選択され，Color Mixingウィジェットによってreason 引数で返される，RGB値に初期化されます。

3. カラー・セルのエントリを割り当てます。プログラマはXlib XAllocColorルーチンに，使用するディスプレイ識別子とカラー・マップ， およびXColorデータ構造体へのポインタを渡します。XAllocColor はXColor.pixelメンバに，データ構造体のred，green，blueの各RGB 値によって決定されるRGB値を設定します。

4. k_total_orderウィジェットのbackground属性を設定します。 このウィジェットは，Main Windowウィジェットの子のXmScrolledList ウィジェットです。k_total_orderウィジェットは，ウィンドウ階層においてMain Window ウィジェットの一番上にあります。このため，このウィジェットの背景色は，Main Window ウィジェットの背景色と一致しなければなりません。

   Main Windowウィジェットのbackground属性を設定します。

## 6.7.3 Color Mixingウィジェット-「適用」コールバック

DECburgerの「適用」コールバック・ルーチンを例 6-5 に示します。「適用」コールバックは，Color Mixing ウィジェットの更新や管理の解除を行わないことを除いて， 「了解」コールバックに似ています。

### 例 6-5 Color Mixingウィジェット-「適用」コールバック

       .
       .
       .

    static void apply_color_proc(widget_id, tag, reason)
       Widget                     widget_id;
       int                        *tag;
       DXmColorMixCallbackStruct  *reason;

    {

       int         ac;
       Arg         arglist[10];
       XColor      newcolor;

       newcolor.red = reason->newred;
       newcolor.green = reason->newgrn;
       newcolor.blue = reason->newblu;

       if (XAllocColor(the_display,
                      XDefaultColormapOfScreen(the_screen), &newcolor)) {

         ac = 0;
         XtSetArg (arglist[ac], XmNbackground, newcolor.pixel);ac++;
         XtSetValues(widget_array[k_total_order], arglist, ac);
         XtSetValues(main_window_widget, arglist, ac);

        }

       else
            s_error ("can't allocate color cell");

    }

       .
       .
       .

## 6.7.4 Color Mixingウィジェット-「取消」コールバック

DECburgerの「取消」コールバック・ルーチンを例 6-6 に示します。「取消」コールバックはColor Mixing ウィジェットの管理を解除して，Main Windowウィジェットを， 最後に管理されたときの状態に復元します。「取消」コールバックは， ユーザが「適用」プッシュ・ボタンをクリックして行なった変更をすべて取り除きます。

### 例 6-6 Color Mixingウィジェット-「取消」コールバック

       .
       .
       .
    /* Color Mix Cancel Callback */

    static void cancel_color_proc(widget_id, tag, reason)
       Widget                     widget_id;
       int                        *tag;
       DXmColorMixCallbackStruct  *reason;

    {

       int         ac;
       Arg         arglist[10];

    【1】XtUnmanageChild(color_widget);

    【2】ac = 0;
       XtSetArg (arglist[ac], XmNbackground, savecolor.pixel);ac++;
       XtSetValues(widget_array[k_total_order], arglist, ac);

    【3】XtSetValues(main_window_widget, arglist, ac);

    }

       .
       .
       .

1. Color Mixingウィジェットの管理を解除します。

2. k_total_orderウィジェットを，最後に管理されたときの状態へ復元します。k_total_order ウィジェットは，ウィンドウ階層においてMain Window ウィジェットの一番上にあります。このため，このウィジェットの背景色は，Main Window ウィジェットの背景色と一致しなければなりません。

3. Main Windowウィジェットを，最後に管理されたときの状態へ復元します。

## 6.7.5 Color Mixingウィジェットの作成- ツールキットの例

例 6-7に示す例を使用すれば， DECburgerサンプル・プログラムのメイン・ウィンドウの背景色を設定できます。

### 例 6-7 Color Mixingウィジェットの作成-ツールキットの例

       .
       .
       .

    /* Color Mix Widget Creation */

    static void create_color()
      {
               unsigned int        ac;
               Arg                 arglist[10];
               XtCallbackRec       ok_callback_arg[2];
               XtCallbackRec       apply_callback_arg[2];
               XtCallbackRec       cancel_callback_arg[2];
               XColor              newcolor;
               Arg                 al[1];

          【1】if (!color_widget) {

               apply_callback_arg[0].callback = apply_color_proc;
               apply_callback_arg[0].closure = 0;
               apply_callback_arg[1].callback = NULL;
               apply_callback_arg[1].closure = NULL;

               cancel_callback_arg[0].callback = cancel_color_proc;
               cancel_callback_arg[0].closure = 0;
               cancel_callback_arg[1].callback = NULL;
               cancel_callback_arg[1].closure = NULL;

               ok_callback_arg[0].callback = ok_color_proc;
               ok_callback_arg[0].closure = 0;
               ok_callback_arg[1].callback = NULL;
               ok_callback_arg[1].closure = NULL;

          【2】XtSetArg(al[0], XmNbackground, &newcolor.pixel);
               XtGetValues(main_window_widget, al, 1);

          【3】XQueryColor(the_display,
                        XDefaultColormapOfScreen(the_screen), &newcolor);

          【4】ac = 0;

               XtSetArg (arglist[ac], XmNcancelCallback, cancel_callback_arg);ac++;
               XtSetArg (arglist[ac], XmNokCallback, ok_callback_arg); ac++;
               XtSetArg (arglist[ac], XmNapplyCallback, apply_callback_arg); ac++;
               XtSetArg (arglist[ac], DXmNorigRedValue, newcolor.red); ac++;
               XtSetArg (arglist[ac], DXmNorigGreenValue, newcolor.green); ac++;
               XtSetArg (arglist[ac], DXmNorigBlueValue, newcolor.blue); ac++;
               XtSetArg (arglist[ac], DXmNcolorModel, DXmColorModelPicker); ac++;

          【5】color_widget = DXmCreateColorMixDialog (toplevel_widget,
                                                     "Color Mix Widget",
                                                      arglist, ac);

          【6】savecolor.red = newcolor.red;
               savecolor.green = newcolor.green;
               savecolor.blue = newcolor.blue;
               savecolor.pixel = newcolor.pixel;

          【7】XtManageChild(color_widget);
               return;
            }

            else {
               ac = 0;
          【8】XtSetArg(arglist[ac], XmNbackground, &savecolor.pixel);
               XtGetValues(main_window_widget, arglist, 1);

               XQueryColor(the_display,
               XDefaultColormapOfScreen(the_screen), &savecolor);

          【9】XtManageChild(color_widget);
            }

        }

       .
       .
       .

1. Color Mixingウィジェットが存在しない場合は，コールバック・ ルーチン・リストの要素に値を割り当ててください。各コールバック・ ルーチンのデータ構造体には，コールバック・ルーチンのアドレスとタグが入っています。 この場合，コールバック・ルーチンはok_color_proc ，apply_color_proc，cance_color_procです。タグの値は使用されていません。 また，各コールバック・ルーチンのデータ構造体はNULL で終了します。

2. Color Mixingウィジェットが最初に管理されるとき，Color Displayサブウィジェットのもとの色は，変更するオブジェクト(この場合はMain Window ウィジェット)の色と一致しなければなりません。 このため，XtSetArgおよびXtGetValuesの各Intrinsicsルーチンを呼び出して，Main Window ウィジェットの背景色を取得し，それを newcolor.pixelフィールドに格納します。

3. Xlib XQueryColorルーチンを呼び出して， newcolor.pixelのピクセル値に関連するRGB値を取得します。XQueryColor はnewcolorデータ構造体のred，green，blueの各フィールドに値を設定します。

   注意
     このように実現すると， アプリケーションはColor Displayサブウィジェットの初期の色を決定できます。UIL を通してDXmNorigRedValue，DXmNorigGreenValue， DXmNorigBlueValueの各値を設定する場合は，Main Windowウィジェットの背景と一致するように，RGB 値をUIL内に直接コーディングしなければなりません。

4. XtSetArgルーチンを呼び出して，Color Mixingウィジェットの初期のリソースを設定します。

   DXmNcolorModelリソースで色選択カラー・モデルを指定し，アプリケーションをカラー以外のシステムに表示する場合，Color Mixer サブウィジェットはそのシステムの省略時のカラー・ モデルを使用することに注意してください。

5. DXmCreateColorMixDialogルーチンを呼び出して，ポップアップ・ ダイアログ・ボックスを使用したColor Mixingウィジェットを作成し， それを管理します。

6. Main WindowウィジェットのもとのXmNbackgroundの色を保管し， あとで復元できるようにしておきます。

7. Color Mixingウィジェットを管理します。Color Mixingウィジェットのコールバックは， 必要に応じてColor Mixingウィジェットを更新します。

8. Color Mixingウィジェットがすでに存在する場合，Main Windowウィジェットの現在のXmNbackgroundのピクセル値を取得し，XQueryColor を呼び出して関連するRGB値を取得します。 savecolor.red，savecolor.green，savecolor.blueの各フィールドはRGB 値を格納して，あとで復元できるようにしておきます。

9. Color Mixingウィジェットを管理します。Color Mixingウィジェットのコールバックは， 必要に応じてColor Mixingウィジェットを更新します。

[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ]