リスト13−1の32行目の変数info_patternの初期化を見てください。
0xFFFF,0xFFFF,0xFFFF,0xFFFF,が延々と64行も並んでいます。
配列のサイズを直接数値で指定せず、[]としているため、サイズは4×64=256になります。デー タ数が増減しても、0xFFFFの行を増減すれば良いだけだから完璧で、何も問題ないと思ってはいけ ません。
リスト13−1の171行のみで参照しています。それを含む関数は、
rgb_info_image = (Server_image) xv_create(NULL,SERVER_IMAGE, XV_WIDTH,IMAGE_WIDTH, XV_HEIGHT,IMAGE_HEIGHT, SERVER_IMAGE_BITS,info_pattern, NULL);となっています。関数xv_createは、xv_で始まっていますが、これはXViewのライブラリ関数であ ることを示しています。関数名の先頭数文字で関数の分類することは重要ですよ。
ここでは、その中の xv_create という、ウィンドウ、パネル、ボタンなど、XViewでは「オブジェ クト」と呼ぶものを作る関数をいっぱい使用しています。引数は、
xv_create( owner, object, attrib-name, attrib-value, ........................ NULL )の形に並べます。最初はオーナー、つまり親です。ウィンドウ上にパネルを配置し、パネル上にボ タンを配置するという感じで、各々の所属を指定します。ボタンなど、通常のものを作るときには、 それらは何かの上に配置するので、ownerは自然に決まります。しかし、作る物によっては親が無 いものもあります。この場合がそういう例外で、NULLを指定します。
2番目の引数が、作りたい物(オブジェクト)の種類を指定します。作ることのできる物はあら かじめ決まっていて、その中から選びます。ここではXウィンドウをちゃんと理解しないと意味不 明なSERVER_IMAGEを指定しています。ふつうは、CANVAS,PANEL,MENUなどという、もっとイメージ のつかみ易いものになります。
3番目以降は、1行に属性名と属性値を組で書くのが「作法」になっています。属性名に許され るものもあらかじめ決まっていますが、こちらは相当の数があり、いまだ私も見たことも聞いたこ ともないものが多数あるはずです。属性名はオブジェクトと同様、英大文字だけでできたXViewの マクロ名です。
この属性指定は、属性名でNULLを指定することで終了します。可変長引数のとき、引数の最後を 示すために、最後の引数はNULL(0)にしてしまうことは常套手段です。ということで、関数 xv_createの引数の個数は可変です。
ここで「問題」です。このxv_createという関数も当然C言語で書かれた関数でメーカーから提 供されているのですが、いったいどうやったらこのような関数を作れるでしょうか。答は参考文献 [13-1]「C言語のバイブル」にありますので探してください。さらに、自分でこのような関数をぜ ひ作って確認してみてください。
イメージのサイズは、64×64です。ソースの1行が画面上の小さなイメージの1行に対応するよ うに書かれています。各ビットは、1のとき前景色(foreground)、 0のとき背景色(background) になります。直前の2行で、
XV_WIDTH,IMAGE_WIDTH, XV_HEIGHT,IMAGE_HEIGHT,とあり、これでイメージの幅、高さを指定しています。当然、この値と配列のサイズは対応しなけ ればいけません。
今は64×64でプログラムが組まれています。さて、80×80になったら、どうするのでしょう。さ らに、マウスでウィンドウサイズを実行中に変更したとき、その場で適当なサイズを自動計算し、 適当なイメージサイズにすることになったら、もうソースプログラム中に直接サイズを数字で書く ことは不可能です。
そうなんです。ウィンドウ対応になると、今までのように、すべてのサイズを「固定的」に扱う ことが不可能になります。色々なサイズや位置を、実行時にウィンドウシステムに問い合わせなが ら決めなければならなくなります。技術的にはどうということはないのですが、「発想の切り替え」 が必要になります。この辺りが難しいと思われる人が多い理由なのでしょうか。
したがって、ソース中にだらだらと初期値、それも全部0xFFFFを並べるなんてことはダメなので す。まあ、64行にもわたって0xFFFFを書き並べるなんてのは、ウィンドウシステム以前の問題です。
普通の作法は、ウィンドウのサイズが決まってから、サーバーイメージは