データボックス編集
目次
注:文中の青本とはBTRON1プログラミング標準ハンドブックのことを指します。
超漢字にはHMIマネージャ群や、アプリケーションプログラムで使用する固定的な
データ群をプログラムから切り離した「データボックス」として定義しておき、
その中に存在するデータ項目を効率的かつ統一的に取り扱う手段が用意されてい
る(青本8章参照)。
データボックスの利点
データボックスを利用する利点としては以下のような点が挙げられる。
プログラムとデータの分離
データボックスのデータはプログラムと切り離されている為、データボック
スのデータを変更した場合、プログラムを再コンパイルする必要がなくなる。
例えば、ウィンドウに特定の文字列を表示する場合、データボックスを使わなかった
場合はプログラム中で例えば"Hello"文字列を格納する変数mojiretuを以下のよ
うに記述し、このmojiretuを引数として画面に文字を表示するシステムコールを
呼ぶ。
TC mojiretu[] = { TK_H, TK_e, TK_l, TK_l, TK_o, TNULL };
表示する文字列を"World"に変更する場合は
- mojiretuの内容が"World"を表すようにプログラムを書換える。
- プログラムを再コンパイルする。
- 実行ファイルを超漢字に転送。
- アプリケーションを更新する。
という手順をとらなければならない。
一方データボックスを使った場合、"Hello"というデータを「文字列データ」と
してIDをつけてデータボックスに(データボックス編集アプリケーション等
を使って)登録し、プログラム中ではそのIDを指定して"Hello"という文字列デー
タを取り出して表示する。
表示する文字列を"World"に変更する場合は、データボックス内の"Hello"という
文字列を変更するだけで
OKである。
ここでは文字列に関する例を挙げたが、文字列に限らず、パーツやメニューを扱
う場合も同様にデータボックスを使用すればプログラムの変更を伴わずにデータだけを
変更することが可能となる。
データの扱いが容易になる。
プログラム中にパーツ等のデータを記述した場合、例えば"確認"という文字が表
示されたテキストモーメンタリスイッチの場合以下のように記述する必要がある。
TC kakunin[] = { MC_STR, 0x334e, 0x4727, 0x0000 }; /* 確認 */
SWSEL msw = { MS_PARTS, { 0, 0, 70, 24 }, 0, kakunin, 0 };
この方法では
- 慣れるまで(慣れても結構大変)一見してこの記述がどのようなパーツを表す
のか理解するのが困難である。また記述自体も困難である。つまり、プログラム
の可読性が低くなる。
- データが多くなると扱いが大変になる。上記のようなデータが大量にプログ
ラム中に埋め込まれるとなにがなんだかわからなくなる可能性が非常に高い。
- 変数名の管理が大変である。データが多くなるとそれだけ、データを格納す
る為の変数を記述する必要があり、これがまたこんがらがる大きな原因となる。
- 変更が大変である。GUIアプリケーションを作る場合、画面の見栄えを良く
する為にパーツ等の(サイズや位置や表示される文字に対して)微調整を行う事が
よくある。プログラムに直接パーツ等のデータを書き込んでいた場合、微調整を
行う度にコンパイルする必要があり、これは筆者の経験上非常に面倒
である。データボックスを使えばデータはプログラムと切り離されているのでこ
の点について心配する必要が無くなる。又筆者が用意したシーンに関する機能と
ライブラリを使用すれば画面のレイアウトを図形エディタのようにGUIで行う事
が可能となる。
このアプリケーションは以下の事を行うものです。
- ポインタイメージ以外のほぼ全ての青本で定義されたデータボックスデータ
の編集をGUIで行う事が出来る。編集するデータは起動した実身の中のレコード
タイプ10(データボックスレコード。青本付2-3参照)のレコードである。
- データボックスのデータの表示位置をGUIで(基本図形エディタのような方法
で)編集し、それをシーンとして(マイクロスクリプトのシーンのようなもの)登
録することができる。このシーンデータは起動した実身の中のレコードタイプ
31(アプリケーションレコード)の一つ(レコードにはヘッダがついている)である。
このシーンデータを特定のウィンドウに表示する為のライブラリ関数を用意した
ので、シーンの内容を画面に表示するプログラムを容易に記述する事が出来る。
データボックス編集の実行機能付箋が貼ってある仮身を選択して実行する。
なお、すでに記述したが、このアプリケーションは起動した実身中の「データボッ
クスレコード」に対して編集を行うので、アプリケーション登録されたアプリケー
ション実身をアプリケーション一覧等を使っ
てとってきてそれにデータボックス編集の実行機能付箋を張り付けて実行する方
法がある。
ただし、この方法では万が一データボックスデータが壊れると取り返しがつかな
くなるため、慎重を期するなら別にデータボックスデータだけを編集する為の実
身を作り(これは単純に原紙箱からデータボックス編集用紙を取って来るだけで
よい)、編集はそちらで行い、作成されたデータをアプリケーション更新又はapdを使ってアプ
リケーションファイルに移すという方法が良いだろう。
筆者は後者の方法をお勧めする。
このアプリケーションを実行すると以下のようなウィンドウが作られる。
と呼ぶ。以下各ウィンドウについて説明する。
メインウィンドウには現在「道具箱ウィンドウ」で選択さ
れているデータボックスのタイプのデータの一覧が表示される。
画面の説明
メインウィンドウには以下の3種類のデータが表示される。
- 通し番号
- 画面左端の数字はそのタイプのデータに1から順に付けられる通し番号である。
この番号はあくまでも目安の為についているだけであり、そのデータをプログラ
ム中で扱う為に使われることは一切ない。
- ID番号
- 画面の左から2番目の数字はそのデータのID番号である。プログラム中でそのデー
タを扱う場合はこのID番号を使って指定する事になる。
- データの外観
- 画面右に並んでいるのがデータボックスに格納されるデータの外観である。なお、
標準メニュー、汎用メニュー、パネルのデータはあくまで、似せて表示されてい
るだけであり、実際のそれとは微妙に異なる場合があるので注意する必要がある。
これら3種類のデータの実際の外観は「道具箱ウィンドウ」
のテストボタンを押す事で参照する事が出来る。
メインウィンドウでの操作
メインウィンドウでは以下の操作を行う事ができる。
- データの(通し番号による)選択
- 通し番号の部分をPDでクリックすることでその通し番号のデータを選択状態にす
る事が出来る。選択状態になったデータはその詳細情報が「デー
タ編集ウィンドウ」に表示されその内容を編集することが可能となる。なお、
この方法で選択したデータをドラッグして変形する事は基本的に出来ないので注
意する事(今後の拡張のためこうしている)。
- IDの変更
- IDの部分をPDでクリックするとID変更パネルが表示される。新しいIDを入力して
設定ボタンを押すとそのデータのIDが変更される。なお、すでに存在するID番号
や負のID番号をを設定した場合はなにも起こらない。なお以下のID番号は可能な限り使用をさけること。
- ピクトグラムとパターンと図形ビットマップデータの小さいID番号(だいた
い30以下)。ここにはデフォルトのデータが設定されており、重ねて設定すると
不都合が起きる場合がある。
- パターンデータの0〜255番。このアプリケーション及びデータボックスデー
タ用ライブラリでは図形セグメントデータのパターンのうち0〜255番のパターン
データはその番号のカラーマップ色の塗りつぶしパターンとして扱われており、
重複すると不都合が起きる場合がある。
- パターン、ピクトグラム、図形ビットマップデータ以外の百万台のID。この
アプリケーションが使用しているので使用するとこのアプリケーションの動作に
不都合が起きる場合がある。
- データの(データの外観による)選択
- データの外観部分をPDでクリックする事によってデータを選択状態にすることが
できる。なお、以下に示すデータのタイプの場合、プレスした位置によってデー
タ内のオブジェクトを選択する事がある。
データタイプ | 動作 |
パーツ(スイッチセレクタ、 スクロールセレクタ) | すでにそのデータが選択状態の時にプレスすると、プレスした場所にある項目が選択される |
標準メニュー | 標準メニューの項目を表す文字列の上でプレスするとその項目が選択される |
汎用メニュー | 汎用メニューの項目の上でプレスするとその項目が選
択される。項目以外の所でプレスすると汎用メニュー全体が選択される |
パネル | 項目の範囲内でプレスするとその項目が選択される。項目の
範囲以外の所でプレスすると汎用メニュー全体が選択される |
- 項目の移動
- 汎用メニュー、パネルの項目が選択状態になっている場合、その選択枠上でPDを
プレスすることで、その項目をドラッグ移動することができる。ドラッグ移動出
来る場所にPDを持って行くとPDが移動手になる。ドラッグ移動によって項目をそ
のデータの領域の外へ移動させることはできない。一度選択状態にしないとドラッ
グ移動はできないので注意する事。
項目の移動を行っている際にPDがウィンドウの枠に移動すると、ウィンドウの内
容が自動的にその枠の方向へスクロールする。
- 項目の変形
- 汎用メニュー、パネルの項目が選択状態になっている場合、その選択枠の四隅の
いずれかでPDをプレスすることで、その項目をドラッグ変形することができる。
ドラッグ変形出来る場所にPDを持って行くとPDが変形手になる。ドラッグ変形に
よって項目をそのデータの領域の外へ移動させることはできない。一度選択状態
にしないとドラッグ変形はできないので注意する事。
項目の変形を行っている際にPDがウィンドウの枠に移動すると、ウィンドウの内
容が自動的にその枠の方向へスクロールする。
- データの変形
- 多角形と折れ線以外の図形セグメントデータ、パーツ、汎用メニュー、パネルが
選択状態になっている場合、その選択枠の右下の隅をPDでプレスすることで、そ
のデータをドラッグ変形することができる。ドラッグ変形出来る場所にPDを持っ
て行くとPDが変形手になる。一度選択状態にしないとドラッグ変形はできないの
で注意する事。
データの変形を行っている際にPDがウィンドウの枠に移動すると、ウィンドウの内
容が自動的にその枠の方向へスクロールする。
- 他のウィンドウからのドラッグによるデータの挿入
- 現在表示されているデータがピクトグラム、パターン、図形ビットマップの場合
は他のウィンドウ(主に基本図形エディタ)からビットマップデータをメインウィ
ンドウにドラッグする事で、そのデータを挿入する事が出来る。
データタイプがピクトグラム、ビットマップの場合ドラッグして来たビットマップデータがそのままデータとして格納される。
パターンデータの場合、データ編集ウィンドウの挿入タイ
プが0の場合パターンタイプ0のパターンとして登録される。この場合前景色はビッ
トマップを左上から右下に右方法にサーチして行った時の最初の白以外の色、背
景色は白として設定される。挿入タイプが1の時はパターンタイプ1のパターンと
して登録される。ドラッグした際にはマスクパターンは存在しないがドラッグ後
に特定の色を透明色としてマスクパターンを設定する事も可能である(方法はデータ編集ウィンドウを参照のこと)。パターンタイプについ
ては青本2-19を参照のこと。
上記以外のデータタイプの時にビットマップデータをドラッグした場合や、ビッ
トマップデータ以外のデータをドラッグした場合はなにも行われない。
道具箱ウィンドウはメインウィンドウに表示するデータの
種類の設定、挿入するデータの種類の設定、データの挿入、削除、テスト、デー
タのIDに番号によるソート、格子点の幅の設定、シーンウィン
ドウが表示するシーンの設定を行うウィンドウである。
以下それぞれについて説明する。
- メインウィンドウに表示されるデータタイプ
- 道具箱ウィンドウの左上には現在メインウィンドウに表示されるデータのタイプ
が表示される。この部分をPDでプレスすると、このデータタイプを選択する為の
ポップアップメニューが表示され、メインウィンドウに表示するデータタイプを
選択する事が出来る。なお、キーの1〜9、0がそれぞれのデータに対応しており、
キーによる変更も可能である(1:ポインタ、2:ピクトグラム...0:パネル)。
- 挿入するデータタイプ
- 図形セグメントデータとパーツデータには複数の種類がある。「メインウィンド
ウに表示されるデータタイプ」の右にはそれらのうちどのデータが挿入ボタンに
よってメインウィンドウに挿入されるかを表示する。ここをPDでプレスする事で
ポップアップメニューが表示され上記の場合と同様に選択することが出来る。な
お、現在のタイプが図形セグメントデータかパーツデータのいずれかでない場合
はこの部分には"------"が表示され、操作を行う事はできない。
- 挿入ボタン
- 現在表示されているデータのタイプが図形セグメントデータ、文字列データ、パー
ツデータ、標準メニューデータ、汎用メニューデータ、パネルデータのいずれか
の場合このボタンを押すと現在選択されているデータの次(なにも選択されてい
ない場合は一番最後)に新しいデータ(図形セグメントとパーツデータの場合は上
記の挿入するデータタイプで設定されているタイプのデータ)が挿入される。挿
入されるデータはデータの種類によってそれぞれ決められたデフォルトのデータ
が挿入される。IDは現在選択されているデータのIDの次に大きいID(すでに使わ
れているIDは設定されない)が自動的に設定される。上記以外のデータの場合は
なにも行われない。
- 削除ボタン
- 現在選択されているデータが削除される。なにも選択されていない場合はなにも
行われない。
- ソートボタン
- 現在表示されているデータタイプのデータがIDの小さい順にソートされる。
- テストボタン
- 標準メニュー、汎用メニュー、パネルデータが選択されている場合、それらのデー
タが実際に画面に表示される。なお、パネルをテストした場合はメニューボタン
を押す事でテストから抜けることが出来る。これら以外のデータを表示している
場合もしくは、なにも選択されていない場合はなにも行われない。
- 格子点幅
- メインウィンドウおよびシーンウィンド
ウでデータのドラッグ移動/変形を行う際にデータの座標値がここで設定さ
れている数値の倍数に固定される。
- シーン
- シーンウィンドウで表示するシーンの番号を設定する。シー
ンウィンドウが表示されていない場合はここの値を変更することはできない。
データ編集ウィンドウはメインウィンドウで現在選択され
ているデータを編集するウィンドウである。選択されているデータのタイプによっ
て表示が異なる。以下それぞれのデータタイプで行える設定について述べる。
- ポインタイメージ
- 残念ながら設定してもうまくポインタの表示が行えないので現在の所未サポート
である。
- ピクトグラムイメージ
- 編集できるのはピクトグラムデータの左上の座標のみである。
- パターンデータ
- パターンタイプが0のデータの場合前景色と背景色を変更できる(色の部分をPDで
プレスすると色を選択するポップアップメニューがでて来る)。
パターンタイプが1のデータの場合、データをドラッグして挿入してからデータ
をセーブするまでの間なら透明色を設定する事が出来る。透明色の色で透明色に
する色を選択し、マスク設定ボタンを押せば良い。
なお、透明色の色で設定されている色がメインウィンドウに表示されているすべ
てのパターンタイプ1のパターンの透明色の色として表示される。
挿入パターンタイプの部分でドラッグしてきたビットマップデータをどちらのタ
イプのパターン(0か1)で登録するかを指定する。
- 図形ビットマップイメージ
- 編集できるのは図形ビットマップイメージデータの左上の座標のみである。
- 図形セグメントデータ
- 青本付録2-72で記述されている長方形〜折れ線までのデータを編集できる。
なお、以下の点に注意する事。
- パターンIDとして0〜255を指定すると、その番号のカラーマップの色で塗り
つぶされているパターンが設定される(たとえ、実際にその番号のIDのパターン
が実際に設定されていても)ので注意する事。
- 扇型、弓型、楕円弧の開始点角度および終了点角度はの単位はDegreeで右方
向を0°とし、時計周りに計算する。
- 多角形および折れ線のサイズを図形サイズの所で変更することはできない。
頂点を編集するには点列番号の横の「前の点ボタン」、「次の点ボタン」、点列
番号を表す数値ボックス(直接点の番号を入力する)を使って頂点を指定し、その
下の点座標の欄を埋める事で設定できる。
なお、メインウィンドウには現在編集できる頂点の部分に5x5のサイズの四角形
が表示される。
頂点を挿入した場合、新しい頂点の座標は前挿入の場合現在編集できる頂点とそ
の前(次挿入の場合はその次)の頂点の中間点となる。
- 線の幅を2以上にした場合実際に描画されるデータが図形のサイズおよび図
形の選択領域より線の幅-1だけ右下にふくらむが、これはバグではない。
- 文字列データ
- 編集できるのは文字列の内容のみでありサイズや色などは編集できない(もとも
とそうなっている)。
- パーツデータ
- パーツデータ(青本5-4又を参
照)はシリアルボックスを除きパーツに関するあらゆるデータを設定できる。な
お、シリアルボックスのみあまりに複雑な為、一つの整数値フィールドを持った
シリアルボックスのみ設定できる。
詳しい使い方については青本の5-20のパーツのデータ構造とデータ編集ウィンド
ウを見てもらえばわかる(そのうち詳しく書くかもしれません)と思うので以下の
注意点のみ挙げる。
- スイッチセレクタ及び、スクロールセレクタの編集項目を選択するには、メ
インウィンドウ上で編集したい項目を直接選択するか、データ編集ウィンドウの
ほぼ真中にある項目番号の横の「前項目ボタン」、「次項目ボタン」、項目番号
を表す数値ボックス(直接項目番号を入力する)を使って指定する。この時項目を
不能項目にすると、メインウィンドウで直接選択することはできなくなるので注
意する事。
- パーツの項目として図形を指定した場合その図形データがセーブされていな
いその図形は表示されないので、図形データを新たに挿入し、それをパーツで表
示したい場合は一度セーブをすること。
- 色を設定するパネルの一番下にでる斜め線の引いてある四角形は-1(デフォ
ルト色)を表す。
- 標準メニューデータ
- 標準メニューを設定する。詳しい使い方については青本の4章メニューのデータ
構造とデータ編集ウィンドウを見てもらえばわかる(そのうち詳しく書くかもし
れません)と思うので以下の注意点のみ挙げる。
- 現在選択されている項目がメインメニューの場合、「前挿入ボタン」及び
「次挿入ボタン」はメインメニューの項目を挿入する。
- 現在選択されている項目がサブメニューの場合、「前挿入ボタン」及び
「次挿入ボタン」はメインメニューの項目を挿入する。
- 現在選択されている項目がメインメニューの場合、「削除ボタン」を押すと
そのメニューのサブメニューも一緒に削除される。
- 編集項目を選択するにはメインウィンドウ上で項目をプレスする。これ以外
の方法はない。
- 項目として図形を指定した場合、メインウィンドウ上には"FIG"と表示され
るが実際にはちゃんと図形が入っている。実際の見栄えは道具
箱ウィンドウのテストボタンを押す事で確認できる。なお、セーブされてい
ない図形データをテストで表示する事はできないので、図形データを新たに挿入
し、それをメニューで表示したい場合は一度セーブをすること。
- 色を設定するパネルの一番下にでる斜め線の引いてある四角形は-1(デフォ
ルト色)を表す。
- 汎用メニューデータ
- 汎用メニューを設定する。詳しい使い方については青本の4章メニューのデータ
構造とデータ編集ウィンドウを見てもらえばわかる(そのうち詳しく書くかもし
れません)と思うので以下の注意点のみ挙げる。
- 編集項目を選択するには、メインウィンドウ上で編集したい項目を直接選択
するか、データ編集ウィンドウの5行目ににある項目番号の横の「前項目ボタン」、
「次項目ボタン」、項目番号を表す数値ボックス(直接項目番号を入力する)を使っ
て指定する。
- 項目として図形を指定した場合、メインウィンドウ上には"FIG"と表示され
るが実際にはちゃんと図形が入っている。実際の見栄えは道具
箱ウィンドウのテストボタンを押す事で確認できる。なお、セーブされてい
ない図形データをテストで表示する事はできないので、図形データを新たに挿入
し、それをメニューで表示したい場合は一度セーブをすること。
- 色を設定するパネルの一番下にでる斜め線の引いてある四角形は-1(デフォ
ルト色)を表す。
- 汎用メニューにデータを挿入する場合、以下のような位置、サイズで挿入される。
- 格子点の幅が2以上かつ挿入される項目が汎用メニューの一番目の項目でな
い場合
- 新たに挿入される項目のサイズは挿入する前の項目(以下前項目)と同じになる。
位置は左上の点のx座標が前項目のそれと同じ、y座標が前項目の左下の点のy座
標+格子点の幅に設定される。この結果項目が汎用メニューからはみ出す場合は
はみ出さない用に補正される。
- 上記以外の場合
- サイズは100x16、位置は汎用メニューの左上端に設定される。
- パネルデータ
- パネルを設定する。詳しい使い方については青本の6章パネルのデータ構造とデー
タ編集ウィンドウを見てもらえばわかる(そのうち詳しく書くかもしれません)と
思うので以下の注意点のみ挙げる。
- 項目を挿入するにはデータ編集ウィンドウの下から二行目の「前挿入ボタン」
又は「次挿入ボタン」を押せば良い。挿入される項目は一番下の行の挿入タイプ
と挿入番号が示すデータである。なお、挿入後も上から10行目の項目タイプと番
号の部分でデータの変更を行うことは可能である。
- 編集項目を選択するには、メインウィンドウ上で編集したい項目を直接選択
するか、データ編集ウィンドウの7行目ににある項目番号の横の「前項目ボタン」、
「次項目ボタン」、項目番号を表す数値ボックス(直接項目番号を入力する)を使っ
て指定する。
- 存在しない項目を設定した場合はその項目はメインウィンドウ上では存在し
ない事を表す四角形に斜め線を引いた図形として表現される。一つでも存在しな
い項目を設定した場合テストボタンを押してもなにも表示されないので注意する
事。
- セーブされていない項目を設定した場合はメインウィンドウにはちゃんと表
示されるが、テストボタンでその表示をテストする事はできない。テストボタン
を押してなにも表示されない場合は一度セーブしてからもう一度試して見ると良
い。
- 色を設定するパネルの一番下にでる斜め線の引いてある四角形は-1(デフォ
ルト色)を表す。
シーンウィンドウとは?
シーンウィンドウはデータボックスデータとして登録されたデータを組み合わせ
て一つのシーン(マイクロスクリプトのシーンのようなもの)を作るためのエディ
タである。このウィンドウ上でデータボックスのデータを自由に配置してセーブ
するとタイプ31番のレコードにそのデータが保存される。アプリケーションプロ
グラム側でこのレコードを読み込み、指定したウィンドウ上にデータボックスの
データをシーンウィンドウ上に配置した通りに簡単に表示する
ライブラリを別に用意した。
このウィンドウ上に表示されているデータはすべてデータボックスで登録された
データであり、このウィンドウはそれらのデータを参照して任意の位置に表示す
るものである。従って同じデータを同じシーンに同時に複数登録する事も可能で
ある。
このウィンドウで表示されているデータが参照している元データの編集はサイズ
以外に関しては行えない(編集するにはデータ編集ウィンドウ
を使う事)。
シーンは0〜255までのいずれかの番号を持っており、シーンウィンドウには道具箱ウィンドウの右下に表示されている番号のシーンが表
示される。
シーンウィンドウでの操作
シーンウィンドウ上では以下の操作を行う事ができる。
- データのPDによる直接選択
- シーンウィンドウ上に表示されているデータ上でPDをプレスすることでそのデー
タを選択することが出来る。選択されたデータはシーンデータ
編集ウィンドウで編集することが出来る。なお、ここでの選択とメインウィ
ンドウでの選択は全くの別物なので注意する事。
シフトキー(青又は赤の矢印キー)を押しながら選択することで、他の選択状態を
そのままにしてあらたにPDでプレスしたデータを選択することが出来る。なお、
この時すでに選択されているデータをPDでプレスした場合はそのデータのみ選択
状態でなくなる。
- データのPDによるドラッグ選択
- シーンウィンドウ上でデータ以外の場所でPDをプレスし、プレスしたままPDを動
かす事で範囲を指定する(範囲は選択枠で表示される)事ができる。PDのプレスを
解除した時点で指定された範囲の選択枠内に完全に含まれるデータが全て選択さ
れる。
シフトキーを押しながらこの操作を行うと、選択枠内に完全に含まれるデータの
うちすでに選択状態にあるものは選択状態が解除され、そうでないものは新たに
選択される。
データの選択枠を設定している際にPDがウィンドウの枠に移動すると、ウィンド
ウの内容が自動的にその枠の方向へスクロールする。
- データの移動
- シーンウィンドウ上でデータが選択状態になっている場合、その選択枠内でPDを
プレスすることで、そのデータをドラッグ移動することができる。ドラッグ移動
出来る場所にPDを持って行くとPDが移動手になる。一度選択状態にしないとドラッ
グ移動はできないので注意する事。なお、ここでデータを移動してもそのデータ
が参照するデータボックスの元データには一切影響を及ぼさない。
データの移動をしている際にPDがウィンドウの枠に移動すると、ウィンドウの内
容が自動的にその枠の方向へスクロールする。
- データの変形
- シーンウィンドウ上で一つのデータのみが選択状態になっている場合、その四隅
でPDをプレスすることで、そのデータをドラッグ変形することができる。ドラッ
グ変形出来る場所にPDを持って行くとPDが変形手になる。一度選択状態にしない
とドラッグ変形はできないので注意する事。なお、ここでデータを変形すると選
択されているデータが参照するデータボックスの元データも変形し、それに伴い
そのデータを参照しているすべてのシーンウィンドウのデータも変形するので注
意する事。又、変形を行えるのは多角形、折れ線以外の図形データとパーツデー
タのみである。
データの変形をしている際にPDがウィンドウの枠に移動すると、ウィンドウの内
容が自動的にその枠の方向へスクロールする。
- データの挿入
- リターンキーを押す事でシーンデータ編集ウィンドウの一
番下に表示されているデータがシーンウィンドウに挿入される。挿入されたデー
タは一番手前に挿入され、選択状態となる。
表示に関する注意
存在しないデータを挿入した場合、そのデータが存在しない事を表す四角形に
斜め線の図形が表示される。
シーンウィンドウ内のデータには前後の関係があるが、パーツに関してはそれが
実際の描画に反映されないことがあるので注意する事(そもそもパーツを重ねて
表示させる事自体がおかしいはずである)。
メインウィンドウでデータを編集してもその変化はすぐにはシーンウィンドウに
は表れない。この場合メニューから再表示を選択することでシーンウィンドウの
表示内容を正しくすることができる。
シーンデータ編集ウィンドウはシーンウィンドウで選択さ
れているデータを編集するウィンドウである。以下の操作を行える。
- 座標
- 選択されているデータの座標を設定できる。ここで設定された座標は選択されて
いるデータの参照する元データには影響を及ぼさない。
複数データが選択されている場合はそれらのデータがまとめて移動される。
- サイズ
- 選択されているデータのサイズを設定できる。ここで設定された座標は選択され
ているデータの参照するデータボックスの元データに設定されるので注意する事。
それに伴いそのデータを参照しているすべてのシーンウィンドウのデータも同様
に変形する。変形を行えるのは多角形、折れ線以外の図形データとパーツデータ
のみである。
なお、データが複数選択されている場合、サイズはそれらのデータを含む最小の
長方形のサイズをあらわし、変更することはできない。
- タイプ
- 現在選択されているデータのタイプを変更する。
データが複数選択されている場合は設定できない。
- ID
- 現在選択されているデータのIDを変更する。
データが複数選択されている場合は設定できない。
- 一番前、一つ前、一つ奥、一番奥
- 現在選択されているデータの前後の配置を変更する。
データが複数選択されている場合は設定できない。
- ID格納配列番号
- 現在選択されたデータがパーツの場合、そのパーツを識別する番号を設定できる。
この値は筆者が用意したライブラリの中でも使用される(画
面上に表示されたパーツを操作するにはそのパーツをウィンドウに登録した時に
得られるID番号を使って行う。ID格納配列番号はライブラリの中でそのIDを格納
する配列変数の配列の番号を表す為に使われる)。
データが複数選択されている場合は設定できない。
- 選択
- 現在シーンウィンドウで選択されているデータをメインウィンドウに表示する。
シーンウィンドウでデータが選択されていない場合や、選択されていても、その
データがデータボックスに存在しない場合(四角形に斜線で表示される)はなにも
行われない。
- 描画モードに関する設定
- 上から4行目の右にはシーンウィンドウに描画するデータの描画モードが表示さ
れ、PDによる設定を行う事ができる。以下の2つの場合においてその意味する内
容が異なるので注意する事。
- シーンウィンドウでピクトグラム、パターン、ビットマップ、文字データの
いずれかが一つだけ選択されている場合
- そのデータに関する設定を行う。
- シーンウィンドウで複数のデータが選択されている場合
- 選択されているデータのうち上記のデータタイプについてのみ設定を行う。
- シーンウィンドウで何もデータが選択されていない場合。
- シーンウィンドウにピクトグラム、パターン、ビットマップ、文字データのいず
れかを挿入した場合の文字に関する設定を行う。
データが複数選択されている場合は選択を行う事はできない。
なお、図形セグメントデータとパーツデータは以下の理由により描画モードの設
定を行う事は出来ない。
- 図形セグメントデータにはそのデータ自体に描画モードのデータが含まれている
ので設定は行えない(設定を行うにはデータ編集ウィンドウ
を利用する事。
- パーツには描画モードの概念が存在しないので設定は行えない。
- 文字に関する設定
- 上から5、6行目には文字の属性、サイズ、色に関する設定を行う。以下の2つの
場合においてその意味する内容が異なるので注意する事。なお、色は左が文字の
色、右が文字の背景色を表す。
- シーンウィンドウで文字データが一つだけ選択されている場合。
- その文字に関する設定を行う。
- シーンウィンドウで複数のデータが選択されている場合。
- 選択されているデータのうち文字データのみ設定を行う。
- シーンウィンドウで何もデータが選択されていない場合。
- シーンウィンドウに文字データを挿入した場合の文字に関する設定を行う。
- 挿入
- シーンデータ編集ウィンドウの一番下に表示されているデータタイプ、IDのデー
タをシーンウィンドウに挿入し、挿入されたデータを選択状態にする。現在デー
タが選択されている場合はその手前にデータが挿入される。選択されていない場
合には一番手前に挿入される。
- 削除
- 現在シーンウィンドウで選択されているデータをすべて削除する。
- 挿入タイプ、ID
- 「前挿入ボタン」、「奥挿入ボタン」、リターンキーでシーンウィンドウに挿入
されるデータを設定する。標準メニュー、汎用メニュー、パネルデータは挿入できないので注意する事。
なお、この部分の値、以下の操作が行われた場合にはこれらの値は即座に変更さ
れる。
- メインウィンドウでオブジェクトが新しく選択された場合、選択されたオブ
ジェクトのタイプ、IDが設定される。
- メインウィンドウにあらたにオブジェクトが挿入された場合、挿入されたオブジェクトのタイプ、IDが設定される。
作成したデータボックスのデータをプログラム中で使用するにはまず、アプリケー
ションファイル中に作成したデータボックスレコードが挿入されている必要があ
る。従ってアプリケーション更新などを使ってデータボックス編集の実身からデータボックスレコード
をアプリケーションファイルにコピーして下さい。
また、シーンデータのデータを使用する際も同様にシーンデータのレコード(レコードタイプが
31のレコードです)をアプリケーションファイルにコピーして下さい。
データボックスのレコードの挿入が完了しているならばアプリケーションプログラムの最初の方で
dopn_dat(&(cmd->self)); /* cmdはMAINの引数 */
を記述する事によってそのアプリケーション内でそのデータボックスデータを使
う事が出来るようになる。
以下各データタイプ別にデータの使い方の記述例を示す。
なお、データボックスデータを読み込んだり画面に表示したりする為のライブラ
リが用意してある。使い方についてはデータボックス用ライブ
ラリについてを参照の事。
- ポインタイメージ
- 本アプリケーションではポインタデータは現在の所未サポートなので説明は省く。
- ピクトグラムイメージ
- 通常ピクトグラムイメージはウィンドウや仮身に使用するものであり、使用する
際もピクトグラムデータのID番号を使って指定する為、データボックスのデータ
をプログラマが読み込んで使用することはほとんどない。それでも使いたい場合
はピクトグラムイメージは図形ビットマップイメージと同じ方式で格納されてい
るので、そちらの説明を参照する事。
- パターンデータ
- パターンデータは通常図形データの枠パターンや塗りつぶしパターンを指定する
時に使用する。
- 記述例1(データボックス用ライブラリを使用しない場合)
W size;
W akey;
W id; /* データのIDを格納しておくこと */
PAT *pat;
/* データ項目の参照(青本8-10) */
if ((akey = dget_dat(PAT_DATA, id, 0)) < 0) {
/* エラー処理 */
}
/* データ項目のサイズ取り出し(青本8-17) */
if ((size = dget_siz(akey)) < 0) {
/* エラー処理 */
}
pat = (PAT *)malloc(size);
/* 共有メモリブロックの読み込み(青本1-81) */
if (rea_smb(akey, pat, 0, size, &size) < 0) {
/* エラー処理 */
}
/* 取って来たパターンで長方形の塗りつぶす記述例。
なお、gidには描画する描画環境のID、rには図形の描画位置が
格納されているものとする。 */
gfil_rec(gid, r, pat, 0, G_STORE);
- 記述例2(データボックス用ライブラリを使用する場合)
W id; /* データのIDを格納しておくこと */
PAT *pat;
if (!searchtree(PAT_DATA, id, (B **)&pat)) {
/* エラー処理 */
}
/* 取って来たパターンで長方形の塗りつぶす記述例。
なお、gidには描画する描画環境のID、rには図形の描画位置が
格納されているものとする。 */
gfil_rec(gid, r, pat, 0, G_STORE);
なお、特定の色での塗りつぶしパターンは以下のように記述できるので特にデー
タボックスデータとして設定する必要はないだろう。
PAT pat; /* 上の記述例と違ってポインタでないことに注意! */
pat.spat.kind = 0;
pat.hsize = 1;
pat.vsize = 1;
pat.fgcol = color; /* ここに塗りつぶし色のカラーマップ番号を記述 */
pat.bgcol = 0; /* 背景色。0は白を表す */
pat.mask = FILL100; /* 100%塗りつぶしを表す */
- 図形ビットマップデータ
- 図形ビットマップデータはBMPではなくCBMPの形式(BMPに圧縮形式を表すデータ
(青本2-8))で格納されている事に注意する事。以下の記述例ではビットマップデー
タは圧縮されていないものとする。
- 記述例1(データボックス用ライブラリを使用しない場合)
W size;
W akey;
W id; /* データのIDを格納しておくこと */
CBMP *cbmp;
/* データ項目の参照(青本8-10) */
if ((akey = dget_dat(BMAP_DATA, id, 0)) < 0) {
/* エラー処理 */
}
/* データ項目のサイズ取り出し(青本8-17) */
if ((size = dget_siz(akey)) < 0) {
/* エラー処理 */
}
cbmp = (CBMP *)malloc(size);
/* 共有メモリブロックの読み込み(青本1-81) */
if (rea_smb(akey, cbmp, 0, size, &size) < 0) {
/* エラー処理 */
}
/* 取って来たビットマップをIDがgidの描画環境に描画する記述例。
なお、gidには描画する描画環境のID、rには図形の描画位置が
格納されているものとする。 */
grst_bmp(gid, &r, &(cbmp->bmp), &(cbmp->bmp.bounds), NULL, G_STORE);
- 記述例2(データボックス用ライブラリを使用する場合)
W id; /* データのIDを格納しておくこと */
CBMP *cbmp;
if (!searchtree(BMAP_DATA, id, (B **)&cbmp)) {
/* エラー処理 */
}
/* 取って来たビットマップをIDがgidの描画環境に描画する記述例。
なお、gidには描画する描画環境のID、rには図形の描画位置が
格納されているものとする。 */
grst_bmp(gid, &r, &(cbmp->bmp), &(cbmp->bmp.bounds), NULL, G_STORE);
- 図形セグメントデータ
- 図形セグメントデータはTADで規定されるとおりに格納されている(青本付録
2-72)。/usr/TRON/3B/include/btron/taddata.h にTADデータに関する定義がな
されており、その中のTF_****が図形セグメントデータを表す。従って図形セグ
メントデータを扱う場合は
#include<btron/taddata.h>
を記述する必要がある。
- 記述例1(データの取得にデータボックス用ライブラリを使用しない場合)
W size;
W akey;
W id; /* データのIDを格納しておくこと */
B *ptr;
/* データ項目の参照(青本8-10) */
if ((akey = dget_dat(FIG_DATA, id, 0)) < 0) {
/* エラー処理 */
}
/* データ項目のサイズ取り出し(青本8-17) */
if ((size = dget_siz(akey)) < 0) {
/* エラー処理 */
}
ptr = malloc(size);
/* 共有メモリブロックの読み込み(青本1-81) */
if (rea_smb(akey, cbmp, 0, size, &size) < 0) {
/* エラー処理 */
}
/* 取って来た図形セグメントデータの描画。
ここではデータボックス用ライブラリの関数displayfigdata()を
使って描画している。
なお、gidには描画する描画環境のIDが格納されているものとする。
displayfigdata(gid, ptr, NULL);
- 記述例2(データボックス用ライブラリを使用する場合)
W id; /* データのIDを格納しておくこと */
B *ptr;
if (!searchtree(FIG_DATA, id, &ptr)) {
/* エラー処理 */
}
/* 取って来た図形セグメントデータの描画。
ここではデータボックス用ライブラリの関数displayfigdata()を
使って描画している。
なお、gidには描画する描画環境のIDが格納されているものとする。
displayfigdata(gid, ptr, NULL);
- 文字列データ
- 文字列データは文字列のデータがトロンコードでそのまま入っている。文字列の
位置情報や大きさ、フォント等の情報は入っていないので注意する事。
- 記述例1(データボックス用ライブラリを使用しない場合)
W size;
W akey;
W id; /* データのIDを格納しておくこと */
TC *tcode;
/* データ項目の参照(青本8-10) */
if ((akey = dget_dat(FIG_DATA, id, 0)) < 0) {
/* エラー処理 */
}
/* データ項目のサイズ取り出し(青本8-17) */
if ((size = dget_siz(akey)) < 0) {
/* エラー処理 */
}
tcode = malloc(size);
/* 共有メモリブロックの読み込み(青本1-81) */
if (rea_smb(akey, tcode, 0, size, &size) < 0) {
/* エラー処理 */
}
/* 取って来た文字列データの描画 */
なお、gidには描画する描画環境のID、gidには文字の描画位置が
格納されているものとする。 */
size = tc_strlen(tcode) + 1;
gdra_stp(gid, pnt.x, pnt.y + 16, tcode, size, G_STORE);
- 記述例2(データボックス用ライブラリを使用する場合)
W id; /* データのIDを格納しておくこと */
TC *tcode;
if (!searchtree(TEXT_DATA, id, (B **)&tcode)) {
/* エラー処理 */
}
/* 取って来た文字列データの描画 */
なお、gidには描画する描画環境のID、gidには文字の描画位置が
格納されているものとする。 */
size = tc_strlen(tcode) + 1;
gdra_stp(gid, pnt.x, pnt.y + 16, tcode, size, G_STORE);
- パーツデータ
- パーツをIDを使ってデータボックスから直接設定する関数が用意されている。
- 記述例1(データボックスからIDを使って直接登録する方法)
W id; /* データのIDを格納しておくこと */
W pid; /* パーツIDを格納する変数 */
/* パーツのデータボックスからの登録(青本5-47)。
なお、widにはパーツを登録するウィンドウのIDが格納されているものとする。 */
pid = copn_par(wid, id, NULL);
- 記述例2(データボックス用ライブラリを用いて一旦データをデータボックスからメモリに読み込んでから登録する方法)
W id; /* データのIDを格納しておくこと */
W pid; /* パーツIDを格納する変数 */
PARTS *parts;
if (!searchtree(PARTS_DATA, id, (B **)&parts)) {
/* エラー処理 */
}
/* パーツの登録(青本5-45)。
なお、widにはパーツを登録するウィンドウのIDが格納されているものとする。 */
pid = pcre_par(wid, parts);
- 標準メニュー定義データ
- 標準メニューをIDを使ってデータボックスから直接設定する関数が用意されている。
- 汎用メニュー定義データ
- 汎用メニューをIDを使ってデータボックスから直接設定する関数が用意されている。
- 記述例1(データボックスからIDを使って直接登録する方法)
W id; /* データのIDを格納しておくこと */
W menuid; /* 汎用メニューIDを格納する変数 */
/* 汎用メニューのデータボックスからの登録(青本4-29)。
menuid = mopn_gmn(id);
- 記述例2(データボックス用ライブラリを用いて一旦データをデータボックスからメモリに読み込んでから登録する方法)
W id; /* データのIDを格納しておくこと */
W menuid; /* 汎用メニューIDを格納する変数 */
GMENU *gmenu;
if (!searchtree(GMENU_DATA, id, (B **)&gmenu)) {
/* エラー処理 */
}
/* 汎用メニューの登録(青本4-28)。
menuid = mcre_gmn(gmenu);
- パネルデータ
- パネルをIDを使ってデータボックスから直接設定する関数が用意されている。
- 記述例1(データボックスからIDを使って直接登録する方法)
W id; /* データのIDを格納しておくこと */
W pnlid; /* 汎用メニューIDを格納する変数 */
/* パネルのデータボックスからの生成(青本6-14)。*/
pnlid = popn_pnl(id, NULL);
- 記述例2(データボックス用ライブラリを用いて一旦データをデータボックスからメモリに読み込んでから登録する方法)
W id; /* データのIDを格納しておくこと */
W pnlid; /* 汎用メニューIDを格納する変数 */
PANEL *panel;
if (!searchtree(PANEL_DATA, id, (B **)&panel)) {
/* エラー処理 */
}
/* パネルの生成(青本6-12)。*/
pnlid = pcre_pnl(panel, NULL);
データボックスのデータ及びシーンデータの読み込み、表示に関するライブラリ
とその他GUIアプリケーションを作成する際に役に立つと思われる関数を入れた
miscライブラリを用意したので以下に使い方を示す。
なお、データボックス用ライブラリ内でmiscライブラリの関数を使用しているの
で、データボックス用ライブラリを使用する場合は必ずmiscライブラリも使用す
る事。
ライブラリが定義する変数
- scenedata
- シーンのデータを格納する変数。関数loadscenedata()を使ってシーンデータを
格納する。
- root
- 読み来んだデータボックスデータを格納するtreeのルート。
ライブラリが定義する関数
- void inittreedata()
- rootを初期化する関数。必ず最初に呼ぶ事。
- void loadscenedata(W fd)
- fdが示すファイルデスクリプタのファイルからシーンデータをロードし変数
scenedataに格納する。
- void displayscene(W wid, W scenenum, W *pid, W pmax, RECT *hr)
- widが指定するウィンドウの*hrが示す範囲ににscenenumが示すシーン番号のシー
ンを表示する。hrがNULLの場合はそのウィンドウの描画領域全体に対して描画を
行う。
シーンにパーツが存在する場合、そのパーツをウィンドウに登録し、そのパーツ
IDをpidが示す配列変数のシーンデータの「パーツID配列格納番号」の示す場所
に格納する。もし、格納するpidの場所が0でなければすでにそのパーツは登録さ
れているものとしてパーツの登録は行われない。従って、始めてウィンドウにこ
の関数を使って描画を行う場合はpidの配列の要素をすべて0に初期化しておく必
要がある。
pmaxにはpidの配列の要素数を入れる。もし「パーツID配列格納番号」がpmax以
上であった場合はパーツは格納されない。
この関数はパーツの登録は行うが描画は行わないので、別にcdsp_pwd等を使ってパーツの描画を行う必要がある。
- 記述例
W i, pid[10];
/* ウィンドウに登録されたパーツIDのを格納する変数の初期化 */
for (i = 0 ; i < 10 ; i++) {
pid[i] = 0;
}
/* ウィンドウIDがwidのウィンドウの描画領域全体にシーン番号5番のシーンを
描画する。シーンにパーツが存在した場合は変数pidにそのIDが格納される。 */
displayscene(wid, 5, pid, 10, NULL);
/* パーツの描画 */
cdsp_pwd(wid, NULL, P_RDISP);
- W searchtree(W type, W id, B **ptr)
- typeのタイプのidのIDを持つデータボックスデータをrootのtree又はデータボックスからサーチし、データへのポインタを返す。具体的には以下の動作を行う。
- treeにそのデータが存在すればデータへのポインタをptrに格納し、返り値
として1を返す。
- treeにそのデータ存在しなければデータボックスからデータを読み込み、そ
のデータを新たにtreeに格納し、データへのポインタをptrに格納し、返り値と
して1を返す。
- treeにそのデータが存在せず、データボックスにもそのデータが存在しない
場合、この関数は返り値として0を返す。
又、標準メニュー以外のデータボックスのデータはこの関数内で直接使用できる
形に展開されるので、ptrのデータを直接使う事ができる。それぞれのデータタ
イプに関する記述例については作成したデータボックスの
データの使い方と記述例を参照すること。
- 記述例
W size;
TC *tcode;
/* gidの示す描画環境の一番左上に、IDが5番のテキストデータを表示する例 */
if (searchtree(TEXT_DATA, 5, (B **)&tcode)) {
size = tc_strlen(tcode) + 1;
gdra_stp(gid, 0, 16, tcode, size, G_STORE);
}
- void displaypatdatafromid(W gid, W id, RECT *r, W dispmode)
- gidの示す描画環境の*rの示す位置にidの示すパターンデータをdispmodeが示す
描画モードで描画する。
rがNULLの場合はパターンタイプが0の場合左上の点を0とする座標に、パターン
タイプが1の場合はpat->mpat.bmap.boundsの示す位置に描画する。
データが存在しない場合は*rの位置に(rがNULLの場合は(0,0,50,50)の位置)に四
角形に斜線の図形を描画する。
- void displaypictdatafromid(W gid, W id, RECT *r, W dispmode)
- gidの示す描画環境の*rの示す位置にidの示すピクトグラムデータdispmodeが示す描画モードで描画する。
rがNULLの場合はcbmp->bmp.boundsの示す位置に描画する。
データが存在しない場合は*rの位置に(rがNULLの場合は(0,0,50,50)の位置)に四
角形に斜線の図形を描画する。
- void displaybmpdatafromid(W gid, W id, RECT *r, W dispmode)
- gidの示す描画環境の*rの示す位置にidの示すビットマップデータをdispmodeが
示す描画モードで描画する。
rがNULLの場合はcbmp->bmp.boundsの示す位置に描画する。
データが存在しない場合は*rの位置に(rがNULLの場合は(0,0,50,50)の位置)に四
角形に斜線の図形を描画する。
- void displayfigdatafromid(W gid, W id, RECT *rptr)
- gidの示す描画環境の*rptrの示す位置にidの示す図形セグメントデータを描画す
る。
rがNULLの場合はその図形本来の位置に描画を行う。
データが存在しない場合は*rの位置に(rがNULLの場合は(0,0,50,50)の位置)に四
角形に斜線の図形を描画する。
- void displaytextdatafromid(W gid, W id, RECT *r, W dispmode, W attr, PNT *mojisize, W fgcolor, W bgcolor)
- gidの示す描画環境の*rの示す位置にidの示す文字列データをdispmodeが示す描
画モード、attrが示すフォント属性、*mojisizeが示す文字サイズ、
fgcolor,bgcolorが示す文字色で描画する。
rがNULLの場合はその図形本来の位置に描画を行う。
mojisizeがNULLの場合は文字のサイズは16x16で描画される。
データが存在しない場合は*rの位置に(rがNULLの場合は(0,0,50,50)の位置に四
角形に斜線の図形を描画する。
- void createpartsdatafromid(W wid, W id, RECT *r, W *pid)
- widの示すウィンドウの*rptrの示す位置にidの示すパーツデータを登録し、*pid
に登録したパーツのパーツIDを格納する。
なお、この関数は登録は行うがパーツの描画は行わないので注意する事。
rがNULLの場合はそのパーツ本来の位置に登録を行う。
データが存在しない場合は*rの位置に(rがNULLの場合は(0,0,50,50)の位置)に四
角形に斜線の図形を描画する。
- void displaynodata(W gid, RECT *r)
- *rの位置に(rがNULLの場合は(0,0,50,50)の位置)に四角形に斜線の図形を描画する。
- void displaypatdata(W gid, PAT *pat, RECT *r, W dispmode)
- gidの示す描画環境の*rの示す位置にpatの示すパターンデータをdispmodeが示す
描画モードで描画する。
rがNULLの場合はパターンタイプが0の場合左上の点を0とする座標に、パターン
タイプが1の場合はpat->mpat.bmap.boundsの示す位置に描画する。
- void displaypictdata(W gid, CBMP *cbmp, RECT *r, W dispmode)
- gidの示す描画環境の*rの示す位置にcbmpの示すピクトグラムデータdispmodeが示す描画モードで描画する。
rがNULLの場合はcbmp->bmp.boundsの示す位置に描画する。
- void displaybmpdata(W gid, CBMP *cbmp, RECT *r, W dispmode)
- gidの示す描画環境の*rの示す位置にcbmpの示すビットマップデータをdispmodeが
示す描画モードで描画する。
rがNULLの場合はcbmp->bmp.boundsの示す位置に描画する。
- void displayfigdata(W gid, B *figdata, RECT *rptr)
- gidの示す描画環境の*rptrの示す位置にfigdataの示す図形セグメントデータを描画す
る。
rがNULLの場合はその図形本来の位置に描画を行う。
- void displaytextdata(W gid, TC *tptr, RECT *r, W dispmode, W attr, PNT *mojisize, W fgcolor, W bgcolor)
- gidの示す描画環境の*rの示す位置にtptrの示す文字列データをdispmodeが示す描
画モード、attrが示すフォント属性、*mojisizeが示す文字サイズ、
fgcolor,bgcolorが示す文字色で描画する。
rがNULLの場合はその図形本来の位置に描画を行う。
mojisizeがNULLの場合は文字のサイズは16x16で描画される。
- void createpartsdata(W wid, PARTS *parts, RECT *r, W *pid)
- widの示すウィンドウの*rの示す位置にpartsの示すパーツデータを登録し、*pid
に登録したパーツのパーツIDを格納する。
なお、この関数は登録は行うがパーツの描画は行わないので注意する事。
rがNULLの場合はそのパーツ本来の位置に登録を行う。
- void getfigsize(B *figdata, RECT *r)
- figdataが示す図形セグメントデータのサイズを計算しrに格納する。
- void setfigsize(B *figdata, RECT r)
- figdataの図形セグメントデータの位置をrに変更する。
ただし、多角形と折れ線は左上の点の位置のみ変更される。
- void dragmove(W wid, PNT pnt, RECT *r, W p1, W p2, PNT hpnt, RECT maxrect, W haba)
- widの示すウィンドウで pntの位置でドラッグした r の大きさのオブジェクトの
ドラッグ移動の為の選択領域の移動操作を行う。
p1、p2に数値ボックスのパーツIDを設定しておいた場合、移動中の選択領域の左
上の点の座標がp1、p2 の数値ボックスパーツにリアルタイムに入れられる。そ
の際 hpnt の値を原点とし座標の補正を行う。
maxrect が NULL でなければmaxrectの範囲を越えないように移動を行う。
haba > 0 の場合選択領域の左上のhpntで補正された左上の点の座標が必ずその
値の倍数になるように修正される。
ドラッグ終了時に移動後の選択領域のサイズがrに格納される。
- void dragmove2(W wid, PNT pnt, RECT *r, W p1, W p2, PNT *hpnt, RECT *maxrect, W haba, W flag)
- dragmoveの改良版。違いはhpnt、maxrectの指定がポインタになったこと(必要ない場合はNULLを指定)、flagに0以外の数字を指定する事でウィンドウ外へのドラッグが可能になったことの2点である。
- void dragresize(W wid, PNT kpos, RECT *r, W p1, W p2, PNT hpnt, RECT maxrect, W haba, W mode)
- widの示すウィンドウでkposの位置を固定した r の大きさのオブジェクトのドラッ
グ変形の為の選択領域の変形操作を行う。
p1、p2に数値ボックスのパーツIDを設定しておいた場合、変形中の選択領域の大
きさが p1、p2 の数値ボックスパーツにリアルタイムに入れられる。
maxrect が NULL でなければ maxrectの範囲を越えないように変形を行う。
haba > 0 の場合変形中の座標が必ずその値の倍数になるように修正する。
mode が 1 の時は kposの対角線上の頂点がkposより左上にいかないようにする。
ドラッグ終了時に変形後の選択領域のサイズがrに格納される。
ドラッグ変形時にPDが画面の枠上に来た時にウィンドウのスクロールを行うよう
な関数もあるのだが、少々バグが残っている(スクロールした時に時々選択枠が
消されずに残る事がある)のでまだ公開しません。それでも使いたい人は直接私
に言って下さい。
- void dragresize2(W wid, PNT kpos, RECT *r, W p1, W p2, PNT *hpnt, RECT *maxrect, W haba, W mode)
- dragresizeの改良版。違いはhpnt、maxrectの指定がポインタになったこと(必要ない場合はNULLを指定)である。
- W dragvobjandpaste(WINFOREC *wrec, W wid, PNT pnt, RECT vr, VLINK *vlnk, VOBJSEG vseg, W timeout);
- 仮身を他のウィンドウへドラッグ移動させる。
widに自分のウィンドウIDを設定、pntに仮身をドラッグした時のポインタの座標、vrに仮身のサイズ、vlnkに仮身を表すlnkへのポインタ、vsegに仮身のVOBJSEG、timeoutにドラッグ移動したときにACKメッセージが返って来るまで待つ時間(ミリ秒)を設定する。
wrecがNULLでない場合はwrecが持つウィンドウIDに一致するウィンドウ上にドラッグした場合はなにもしない
自分のウィンドウ上にドラッグした場合はなにもしない。
正常終了時には0、タイムアウトした場合は-1が返る。
- W getpartsnum(W *pid, W pmax, W partsid)
- W型の配列変数pidの中からpartsidと同じ要素を探し、みつかった場合その要素番号を返す。見付からなかった場合は-1を返す。
pmaxにpidの要素数を格納すること。
- 記述例
/* WFUNCREC に格納されているpresfnの関数 */
W presfn(W ix)
{
W partsid; /* 操作されたパーツIDを格納する変数 */
W a; /* 操作の結果を格納する変数 */
W num; /* 操作されたパーツがパーツIDを格納する配列変数の
どの配列に格納されていたかを格納する変数 */
switch (ix) {
case 0: /* メインウィンドウ */
/* パーツ操作処理 */
cfnd_par(winfo[ix].wid, wevt.s.pos, &partsid);
if (partsid) {
/* パーツの動作実行 */
a = cact_par(partsid, &wevt);
/* 動作中断の場合 */
if (a & 0x2000) {
wevt.s.type = EV_NULL;
cact_par(partsid, &wevt);
}
/* このウィンドウに登録されいるパーツIDが要素数10の配列変数pid
に格納されているものとする */
num = getpartsnum(pid, 10, partsid);
switch (num) {
case 0:
/* パーツIDがpid[0]のパーツの操作を記述 */
break;
case 1:
/* パーツIDがpid[1]のパーツの操作を記述 */
break;
/* 以下同様 */
}
break;
}
else {
/* パーツ以外のウィンドウ上でのプレス処理を記述 */
}
break;
/* 他にもウィンドウがあればそのプレス処理を記述 */
}
}
- void printrect(RECT r)
- 長方形rの座標を表示。
具体的には
printf("rect %d %d %d %d\n", r.c.left, r.c.top, r.c.right, r.c.bottom);
を行う。
- void msgpanel(TC *tc)
- *tc が表すテキストと「確認」ボタンの存在するパネルを作成し、画面に表示す
る。
作成されたパネルは*tcの文字列の長さに応じた大きさで作成され、自動的に画
面の中央に配置される。
*tc内にkaigyotcと同じ文字が存在する場合、それを改行記号とみなし、パネル
内で改行して表示する。
なお、改行文字が必要内場合はTNULLを指定すれば良い。
パネルの詳細を変更したい場合はmisclib.h内のdefine文を変更すること。
- 記述例(この例ではデータボックス用ライブラリを使用している)
TC *tc;
/* データボックスからIDが1のテキストデータを取得 */
searchtree(TEXT_DATA, 1, (B **)&tc);
/* そのテキストデータをパネルで表示。
ここでは改行文字として@を指定している。*/
msgpanel(tc, TK_ATMK);
エラーメッセージパネルを表示するには(改行文字を定めて)エラーメッセージを
テキストデータで登録し、それを表示する関数を上記の記述例を元に作成すると
良いだろう。
- void displaytcmsg(W num)
- データボックスのテキストデータの番号を入れるとその内容を上記のmsgpanelを使ってパネルに表示する関数。
このアプリケーションには以下のメニューが用意されている。
- 終了
- アプリケーションを終了する。終了前とデータが異なっていても確認のメッセー
ジは表示されないので注意する事。メインウィンドウのピクトグラムのダブルク
リック又は命令-Eでも同じ動作が行われる。
- 保存
-
- すべて保存
- データボックスデータ及びシーンデータの両方を保存する。命令-Sでも同じ動作
が行われる。
- データボックスデータのみ保存
- データボックスデータのみ保存する。
- シーンデータのみ保存
- シーンデータのみ保存する。
- 表示
-
- 再表示
- 全てのウィンドウの再表示を行う。主にメインウィンドウでデータボックスデー
タの変更を行った場合その変更をシーンウィンドウに反映させる場合に使用する。
- シーンパネル表示
- シーンウィンドウ及びシーン編集ウィンドウの表示のON/OFFを行う。
- バージョン表示
- 現在のバージョンを表示するパネルを表示する。
- 編集
-
- 位置合わせ
- このメニューを選択すると、シーンウィンドウ上で選択されているデータの位置
合わせを行う為のパネルが表示される。パネルで合わせたい項目を設定し、決定
ボタンを押すとシーンウィンドウ上で選択されているデータの位置合わせが行わ
れる。なお、位置合わせは選択されいるデータのうち左上の点が一番上(同じも
のがあればそれらのうちで一番左。それも同じ場合は奥にあるほうのデータ)の
データが基準となる。
なお、2つ以上のデータがシーンウィンドウで選択されていない時にこのメニュー
を選択してもなにも起きない。
- シーンのコピー
- 現在のシーンを他のシーンにコピーする。選択するとパネルが表示されるのでコ
ピーしたいシーン番号を入れて選択するとシーンがコピーされる。
- ウィンドウ
- ウィンドウの一覧をサブメニューで表示する。選択するとそのウィンドウがアク
ティブになる。
- 小物
- 小物の一覧をサブメニューで表示する。選択するとその小物が起動される。
このアプリケーションではキーは主にテキストボックス及び数値ボックスの編集
に使われるが、それらの編集を行っていない場合、以下の操作をキー入力によっ
て行う事が出来る。
- 命令-E
- メニューの終了と同じで、アプリケーションを終了させる。
- 命令-S
- メニューの全て保存と同じでデータボックスデータとシーンデータを保存する。
- 命令-D
- メニューの位置合わせと同じ動作を行う。
- 1-9、0
- メインウィンドウの表示を対応する番号のデータタイプに変更する。対応する番
号は青本の8-20で定義されている番号に対応(ただし10は0)している。ちなみに
道具箱ウィンドウのデータタイプを表す部分をPDでプレス
した時にでてくるポップアップメニューにもその番号は表示されている。
- 改行
- シーンデータ編集ウィンドウの一番下の行に表示されてい
るデータをシーンウィンドウに挿入する。
ここでは各ウィンドウで行える操作の一覧を表にして示す。
表に使用する記号の一覧を以下に示す。
- ○ その操作が行える事を示す。
- × その操作が行えない事を示す。
- △ それぞれの表の下の注の部分で意味を説明する。
- − その操作が未サポートである事を示す。
- 1 ポインタイメージを表す。
- 2 ピクトグラムデータを表す。
- 3 パターンデータを表す。
- 4 図形ビットマップデータを表す。
- 5 図形セグメントデータを表す。
- 6 文字列データを表す。
- 7 パーツ定義データを表す。
- 8 標準メニューデータを表す。
- 9 汎用メニューデータを表す。
- 0 パネル定義データを表す。
- 無 シーンウィンドウでデータが選択されていない状態を表す。
- 複 シーンウィンドウでデータが複数選択されている状態を表す。
メインウィンドウ上での操作
操作内容 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
通し番号部分のPDプレスによるデータの選択 | − | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
IDのPDプレスによる変更 | − | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
データの外観部のPDプレスによるデータの選択 | − | ○ | ○ | ○ | ○ | ○ | ○ | × | ○ | ○ |
データの外観部のPDプレスによるデータ内項目の選択(注1) | − | × | × | × | × | × | △ | ○ | ○ | ○ |
選択状態のデータ内項目のPDによるドラッグ移動 | − | × | × | × | × | × | × | × | ○ | ○ |
選択状態のデータ内項目のPDによるドラッグ変形 | − | × | × | × | × | × | × | × | ○ | ○ |
選択状態のデータのPDによるドラッグ変形(右下隅のみ)(注2) | − |
× | × | × | △ | × | ○ | × | ○ | ○ |
他のウィンドウからのドラッグによるデータの挿入 | − | ○ | ○ | ○ | × | × | × | × | × | × |
- 注1: △はそのタイプのデータで内部項目があるもののみデータの選択が行える事を表す。
- 注2: △は多角形データと折れ線データのみ変形を行えない事を示す。
各データタイプで推奨されるデータID番号
ポインタイメージ | − |
ピクトグラムイメージ | 100以上の値(100以下はシステムで使用するために予約されている) |
パターンデータ | 256以上の値(99以下はシステムで使用するために予
約されている。 255以下は図形セグメントデータのパターンとして使われる)。
|
図形ビットマップデータ | 7以上の値(6以下はデフォルトが設定されている) |
図形セグメントデータ | 1000000(百万)〜1009999以外の値。この範囲のID
はこのアプリケーションで使っている。 |
文字列データ | 1000000(百万)〜1049999以外の値。この範囲のIDはこ
のアプリケーションで使っている。 |
パーツ定義データ | 1000000(百万)〜1049999以外の値。この範囲
のIDはこのアプリケーションで使っている。 |
標準メニュー定義データ | 1000000(百万)〜1009999以外の値。この範
囲のIDはこのアプリケーションで使っている。 |
汎用メニューデータ | 1000000(百万)〜1009999以外の値。この範囲のID
はこのアプリケーションで使っている。 |
パネル定義データ | 1000000(百万)〜1009999以外の値。この範囲のID
はこのアプリケーションで使っている。 |
道具箱ウィンドウ上での操作
操作内容 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
PDによるメインウィンドウに表示されるデータタイプの変更 | ○ |
○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
数キーによるメインウィンドウに表示されるデータタイプの変更 | ○
| ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
PDによる挿入するデータのデータタイプの変更 | − | × | × |
× | ○ | × | ○ | × | × | × |
挿入ボタンのプレスによるメインウィンドウへのデータ挿入 | − |
× | × | × | ○ | ○ | ○ | ○ | ○ | ○ |
削除ボタンのプレスによるメインウィンドウで選択されているデータの
削除 | − | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
ソートボタンのプレスによるメインウィンドウ上のデータのID番号によ
るソート | − | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
テストボタンのプレスによるメインウィンドウで選択されているデータ
の実際の外見の表示 | − | × | × | × | × | × | × | ○ | ○ |
○ |
PDによる格子点幅の変更 | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
○ | ○ | ○ |
PDによるシーンウィンドウに表示されるシーンの変更(注1) | ○ |
○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
- 注1:シーンウィンドウが表示されている場合のみ有効。
メインウィンドウに表示されているデータタイプ毎に異なっているのでここでは
詳しく述べない。青本で各データの仕様を見てもらえればわかると思う。操作に関する注意点は以下の通り。
- パーツは禁止状態(テキストボックス及び数値ボックスは枠ではなく下線で
表示されているもの、それ以外のパーツは文字が薄く表示されているもの。その
パーつ上でPDの操作を行ってもなにも起きない)でないものについてデータの設
定を行える。なお、数値ボックスについてはデータ毎に最小値と最大値があり、
それを越える値を設定した場合は自動的に最小値又は最大値に設定される。
- 四角い枠で囲まれた文字でテキストボックスでないものはその上でPDをプレ
スする事によってポップアップメニュー(汎用メニュー)が表示され、その中から
選択を行う事でデータの設定を行える。なお、枠の中の文字が"−−−−−"と表
示されている場合はそのデータの設定が行えない事を示す。
- 「○○色」という文字の右にある四角い枠で囲まれた部分はそのデータの色
を表す。枠の内部でPDをプレスする事で色を設定するポップアップメニュー(ち
なみにこれは汎用メニューではなくウィンドウでつくられている。汎用メニュー
は32個までしか項目を設定できない為である)が表示され、その中から色を選択
する事で色の設定を行える。枠および色設定パネルで斜めに線がひかれているも
のはデフォルト色を表す-1を表す。デフォルト色を設定できないデータについて
はこの表示は行われない。枠内に×印が表示されている場合はそのデータの設定
が行えない事を示す。
シーンウィンドウ上での操作
操作内容 | 2 | 3 | 4 | 5 | 6 | 7 |
PDによるデータの選択 | ○ | ○ | ○ | ○ | ○ | ○ |
PDによる選択状態のデータのドラッグ移動 | ○ | ○ | ○ | ○ |
○ | ○ |
PDによる選択状態のデータのドラッグ変形(注1) | × | × | × |
△ | × | ○ |
リターンキーによるデータの挿入 | ○ | ○ | ○ | ○ | ○ |
○ |
- 注1: △は多角形データと折れ線データのみ変形を行えない事を示す。
シーンデータ編集ウィンドウ上での操作
操作内容 | 2 | 3 | 4 | 5 | 6 | 7 | 無 | 複 |
データの左上の点の座標の設定 | ○ | ○ | ○ | ○ | ○ | ○ | × | ○ |
データのサイズの変形(注1) | × | × | × | △ | × | ○ |
× | × |
現在選択されているデータのタイプの変更 | ○ | ○ | ○ | ○ |
○ | ○ | × | × |
現在選択されているデータのIDの変更 | ○ | ○ | ○ | ○ |
○ | ○ | × | × |
ボタンのプレスによる現在選択されているデータの表示の前後関係の変
更(注2) | ○ | ○ | ○ | ○ | ○ | × | × | × |
パーツのIDを格納する配列変数の配列番号の設定 | × | × | × |
× | × | ○ | × | × |
現在選択されているデータをメインウィンドウに表示(注3) | ○ |
○ | ○ | ○ | ○ | ○ | × | × |
データの描画モードに関する設定(注4) | ○ | ○ | ○ | × |
○ | × | ○ | △ |
文字データのサイズ、色、属性に関する設定(注4) | × | × | × |
× | ○ | × | ○ | △ |
挿入ボタンのプレスによるシーンウィンドウへのデータの挿入 | ○ |
○ | ○ | ○ | ○ | ○ | ○ | ○ |
挿入ボタンのプレスによる現在選択されているデータのシーンウィンド
ウからの削除 | ○ | ○ | ○ | ○ | ○ | ○ | × | ○ |
シーンウィンドウに挿入するデータタイプの設定 | ○ | ○ | ○ |
○ | ○ | ○ | ○ | ○ |
シーンウィンドウに挿入するデータのIDの設定 | ○ | ○ | ○ |
○ | ○ | ○ | ○ | ○ |
- 注1: △は多角形データと折れ線データのみ変形を行えない事を示す。
- 注2: パーツは必ず他のタイプのデータより手前に表示され、パーツ同士の
前後関係の表示は正しく行われないので注意する事。
- 注3: シーンウィンドウで選択されているデータがデータボックスに存在し
ない場合はなにも行われない。
- 注4: シーンウィンドウでデータが選択されていない場合は今後シーンウィ
ンドウに挿入されるデータに関する設定を行う。
△は複数データが選択されている場合は選択されているデータのうち設定できる
ものについてのみ設定を行う事を表す。
シーンウィンドウに挿入されるデータのタイプが変更される条件。
- メインウィンドウ上でデータを選択した場合そのデータに変更される。
- メインウィンドウ上でデータを挿入した場合そのデータに変更される。
- メインウィンドウ上でデータを削除した場合削除したデータの下(下にデー
タがなければ上)にあるデータ(選択される)に変更される。削除した結果そのタ
イプのデータが存在しなくなった場合は変更されない。
- メインウィンドウに表示されるデータタイプが変更された場合、変更後に選
択されているデータに変更される。
- シーンデータ編集ウィンドウで選択ボタンを押してメインウィンドウの選択状態が変更された場合そのデータに変更される。
- 上記以外でも基本的にメインウィンドウの選択されているデータが変更去れ
た場合、そのデータに変更される。
以下のデータについてはこのデータボックスアプリケーションは対応していませ
んのであしからず。
- ポインタイメージ
- このデータタイプは今の所どうやっても登録したデータをポインタとして表示で
きないので現在の所未サポートです。誰かうまくポインタの形状を変更できた人
はやり方を教えて下さい。
- ピクトグラムイメージ、パターンイメージ、図形ビットマップイメージ
- 現在の所planes=1、pixbits=0x0808以外はサポートしていません。
- パーツデータ
- パーツデータのうちシリアルボックスのみあまりに複雑な為、現在の所一つの整
数値フィールドを持ったシリアルボックスのみ設定できる。その他のパーツは全
ての条件を設定できるはずである。
- 標準メニュー
- 標準メニューの項目リストのデータをデータボックスの文字列データ番号を指定
して設定する事は出来ない。これは現在の所テキストデータとしてMC_ATTR等の
属性をデータとして登録するのが困難なためこうしている。なお、このアプリケー
ション以外で作った標準メニューで項目リストのデータを文字列データの番号で
指定してあるものを読み込む事は可能である。
- 汎用メニュー、パネルデータ
- 標準メニューとは逆に汎用メニューとパネルデータの項目データを実データで指
定する事はできない(全てデータボックスに登録したデータのみを設定できる)。
これに関しては特に今後サポートする予定はないのであしからず(サポートしな
くても困らないと思う)。
- その他
- データタイプとは関係ないが、一つのファイルに2つ以上のデータボックスデー
タタイプ(10)のレコードやシーンデータが存在している場合は動作は保証されな
いので注意する事。
エラーが起きた場合、パネルが開いてエラーメッセージを表示する予定ですが、
現在エラーメッセージに関してはまだ一部のみしか実装されていない。
戻る