typedef struct { UW mode; /* 動作モード (入出力) */ W lpitch; /* 行送り (入力) */ W left; /* 表示領域の左端 (入力) */ W right; /* 表示領域の右端 (入力) */ COLOR frcol; /* 表示領域枠の色 (入力) */ COLOR tgcol; /* 対象文節の文字色 (入力) */ PNT spos; /* 表示開始位置 (入力) */ PNT epos; /* 表示終了位置 (出力) */ W bgpat; /* 変換領域背景パターン (入力) */ W height; /* 表示領域の表示高さ (出力) */ W n_cnv; /* 確定文字数 (出力) */ W n_in; /* 確定よみ文字数 (出力) */ W n_cl; /* 確定文節数 (出力) */ W *cl_cnv; /* 確定文節情報 (出力) */ TC *cnv; /* 確定文字列 (出力) */ W *cl_in; /* 確定よみ文節情報 (出力) */ TC *in; /* 確定よみ文字列 (出力) */ CARET *car; /* カレット構造体へのポインタ (出力) */ } TEXTPORT;
typedef TEXTPORT *TEXTPTR;
#define TXT_FIX 0x0000 /* 固定領域表示 */ #define TXT_INS 0x1000 /* 挿入表示 */ #define TXT_OVER 0x2000 /* オーバーライト表示 */
#define TXT_WAIT 0 /* イベントの取り出しを行う */ #define TXT_NOWAIT 1 /* イベントの取り出しを行わない */ #define TXT_POS 2 /* 表示領域の終了位置が変化でリターン */ #define TXT_KEY 4 /* 不要なキーイベントの場合リターン */ #define TXT_EVT 8 /* 未確定文字列を確定せずにリターン */ #define TXT_NOHAN 0x100 /* 半角未サポート */ #define TXT_DISP 0x8000 /* 変換領域の再表示を行う */
#define TXT_NONE 0 /* 状態の変化なし */ #define TXT_OUT 1 /* 確定文字列が発生した */ #define TXT_SCRL 0x10 /* 表示全体のスクロールが必要である */ #define TXT_CNV 0x100 /* 未確定文字列が残っている */ #define TXT_NOIMG 0x200 /* イメージの復帰ができなかった */
|
W open_text(W wid, W mode, TEXTPORT **text)
W wid ウィンドウID W mode 変換モード TEXTPORT **text オープンしたテキスト入力ポートを戻す領域へのポインタ
≧0 : 正常終了(関数値はオープンしたTIPのID) <0 : エラー (関数値はエラーコード)
wid
で指定したウィンドウ上に、
mode
で指定した変換モードのテキスト入力ポートをオープンし、
そのポインタを *text
で指定した領域に格納する。
mode ::= ( TIP_DIRMD ‖ TIP_CNVMD ) | ( TIP_AUTO ‖ TIP_MANUAL ) | (TXT_FIX ‖TXT_INS ‖ TXT_OVER) TIP_DIRMD 0x100 直接モード(変換なし) TIP_CNVMD 0 変換モード TIP_AUTO 0 自動変換モード TIP_MANUAL 1 指定(マニュアル)変換モード TXT_FIX 0x0000 固定領域表示 TXT_INS 0x1000 挿入表示 TXT_OVER 0x2000 オーバーライト表示
TIP_AUTO
/ TIP_MANUAL
の指定は、
TIP_DIRMD
の場合は意味を持たず無視される。
wid
は、未確定文字列を表示するウィンドウのIDの指定である。
この関数は、 TIP を mode
で指定したモードでオープンし、
TEXTPORT
構造体をプロセスのローカル・メモリ中に生成し、
そのポインタを戻す ( TEXTPORT
構造体の内容は、
read_text() 関数の説明を参照のこと)。
|
VOID close_text(TEXTPORT *text)
TEXTPORT *text テキスト入力ポート
なし
text
で指定したテキスト入力ポートをクローズする。
text
で指定した TEXTPORT
の領域は解放され、
対応する TIP もクローズされる。
表示に関しては、何も行わない。
|
W flush_text(TEXTPORT *text)
TEXTPORT *text テキスト入力ポート
≧0 : 正常終了(関数値は確定状態(TXT_OUT / TXT_NONE)) <0 : エラー (関数値はエラーコード)
text
で指定したテキスト入力ポートをフラッシュして、
残っていた未確定文字列をすべて確定する。
関数値として、確定文字列が発生した場合は、
TXT_OUT ( 1 )
が戻り、
確定文字列が発生しなかった場合は、TXT_NONE ( 0 )
が戻る。
この関数は、read_text()
で、
「入力終」のキーイベントが入った場合と同一の動作を行う。
|
W read_text(TEXTPORT *text, WEVENT *evt)
TEXTPORT *text テキスト入力ポート WEVENT *evt 入力するキーイベント
≧0 : 正常終了(関数値はリターン状態コード) <0 : エラー (関数値はエラーコード)
text
で指定したテキスト入力ポートからテキストを読み込む。
evt
は、入力するキーイベントの指定であり、
終了時には、最後に得られたイベントまたは EV_NULL
が格納されて戻る。
evt
で指定した入力イベントのタイプが、
EV_NULL
の場合は、wget_evt()
の WAIT
モードにより取り出したイベントを入力イベントとする。
text
は、open_text()
で得られた、
以下に示す TEXTPORT
構造体へのポインタである。
typedef struct { UW mode; /* 動作モード (入出力) */ W lpitch; /* 行送り (入力) */ W left; /* 表示領域の左端 (入力) */ W right; /* 表示領域の右端 (入力) */ COLOR frcol; /* 表示領域枠の色 (入力) */ COLOR tgcol; /* 対象文節の文字色 (入力) */ PNT spos; /* 表示開始位置 (入力) */ PNT epos; /* 表示終了位置 (出力) */ W bgpat; /* 変換領域背景パターン (入力) */ W height; /* 表示領域の表示高さ (出力) */ W n_cnv; /* 確定文字数 (出力) */ W n_in; /* 確定よみ文字数 (出力) */ W n_cl; /* 確定文節数 (出力) */ W *cl_cnv; /* 確定文節情報 (出力) */ TC *cnv; /* 確定文字列 (出力) */ W *cl_in; /* 確定よみ文節情報 (出力) */ TC *in; /* 確定よみ文字列 (出力) */ CARET *car; /* カレット構造体へのポインタ (出力) */ } TEXTPORT;
以下に構造体の内容を示す。 座標位置は、すべてテキスト入力ポートのウィンドウの相対座標である。
mode :
open_text()
では、
TXT_WAIT
に初期化される。
mode ::= (TXT_WAIT ‖ TXT_NOWAIT) | (TXT_POS) | (TXT_KEY) | (TXT_EVT) | (TXT_DISP) | (TXT_NOHAN) | (TXT_JPN)
TXT_WAIT (0)
*evt
で指定されたイベントの処理を行った結果、
状態の変化が無かった時は、wget_evt()
の WAIT
モードにより次のイベントを取り出し、
処理を続行する。
取り出したイベントが、EV_NULL
または EV_KEYUP
の場合は、
evt_loop()
関数で定義された IDLE
処理関数を実行し、
カレットの点滅を行った後、再度イベントを取り出す。
TXT_NOWAIT (1)
*evt
で指定されたイベントの処理を行った後、
次のイベントの取り出しを行わずにリターンする。
TXT_POS (2)
TXT_INS
モードでテキストポートをオープンした場合は、
必ずこの指定を行わなくていけない。
この指定は、TXT_NOWAIT
指定の場合は意味を持たない。
TXT_KEY (4)
TXT_WAIT
指定時は、
処理を続行し、TXT_NOWAIT
指定時は、状態変化無しとしてリターンする。TXT_KEY
の指定に無関係にリターンする。
TXT_EVT (8)
TXT_NOHAN (0x100)
TXT_JPN (0x200)
TXT_DISP (0x8000)
read_text()
の処理の結果として未確定文字列が表示されなかった場合に、
次の read_text()
で未確定文字列の再表示を行うために自動的にセットされる場合がある。TXT_DISP
を除いて、
未確定文字列が存在する状態で変更してはならない ( 変更した場合の動作は保証しない )。
lpitch :
TXT_FIX
モードの場合は意味を持たず無視される。
open_text()
では、0 に初期化される。TXT_INS
、 または TXT_OVER
モードの場合、
変換領域が表示領域右端を越えた場合、
次の行に表示する。次の行の水平座標値は表示領域左端となり、
垂直座標値は lpitch
で指定した値だけ下にずらした位置、
すなわち ( spos.c.v + P )
となる。lpitch < 0
の場合は、上の行に表示されることになる。left :
TXT_FIX
モードの場合は意味を持たず無視される。
open_text()
では、0に初期化される。right :
open_text()
では、
0 に初期化されるので、アプリケーションが必ず設定しなくてはいけない。frcol :
open_text()
では、
黒に初期化される。変換領域の表示枠の色は、
対象文節の背景色にも使用される。tgcol :
open_text()
では、
白に初期化される。変換領域中で、
対象文節の背景色は frcol
で指定した色となるため、
アプリケーションは、対象文節の文字色を、frcol
と区別できる色と設定する必要がある。bgpat :
open_text()
では、0 ( 白 ) に初期化される。TXT_FIX
、および TXT_INS
モードでは、
変換領域が小さくなった場合、縮小した領域はこの背景パターンでクリアされる。spos :
open_text()
では、(0,0)に初期化されるので、
アプリケーションが必ず設定しなくてはいけない。epos :
spos
に等しくなる。
height :
TXT_OVER
モードの場合は、
文字の高さ + 2 となり、
TXT_FIX
、TXT_INS
モードの場合は、文字の高さ + 2
となる。
n_cnv :
n_in :
n_cl :
cl_cnv :
n_cl+1
個のワード配列へのポインタであり、
各文節の先頭文字の文字位置が入っている。
先頭の要素は、常に 0 であり、(n_cl+1)
番目の要素は、
確定文字列の次の文字位置、すなわち n_cnv
の値となる。
cnv :
n_cnv
数の文字が確定した文字列となる。
文字列の最後は 0 で終わっていない。
cl_in :
n_cl+1
個のワード配列へのポインタであり、
各文節の先頭文字の文字位置が入っている。
先頭の要素は、常に 0 であり、(n_cl+1)
番目の要素は、
確定「よみ」文字列の次の文字位置、すなわち n_in
の値となる。
in :
n_in
数の文字が確定した文字列となる。
文字列の最後は 0 で終わっていない。
n_cnv 〜 in
は、テキスト入力プリミティブ ( TIP )
から戻される情報そのものとなる。
cl_cnv, cnv, cl_in, in
のポインタで示される内容は、
TIP 内部に取られたバッファへのポインタであり、
その内容を変更してはいけない。
car :
TEXTPORT
と同時にローカルメモリに獲得されたカレット構造体へのポインタであり、
変換領域表示のカレット表示に使用される。
関数値として、以下の状態を示すコードが戻る。
関数値 ::= (TXT_NONE ‖ TXT_OUT ‖ TXT_POS ‖ TXT_KEY ‖ TXT_SCRL) | (TXT_EVT) | (TXT_CNV) | (TXT_NOIMG)
TXT_NONE (0) :
TXT_NOWAIT
指定時のみ)。
TXT_OUT (1) :
TXT_POS
はセットされない。
TXT_POS (2) :
TXT_POS
または TXT_NOWAIT
指定時のみ)。
TXT_KEY (4) :
TXT_KEY
指定時、または 未確定文字列が空の場合のみ)。
TXT_SCRL (8) :
visrect
の領域をはみ出たため、
表示全体のスクロールが必要である ( TXT_INS
または TXT_OVER
モード指定時のみ)。
TXT_EVT (0x10) :
EV_KEYDWN
、EV_AUTKEY
以外のイベントである。
TXT_CNV (0x100) :
TXT_NOIMG(0x200) :
TXT_OVER
指定時のみ)。
TXT_KEY
と TXT_EVT
の場合は、
*evt
には対象のイベントが格納され、
それ以外の場合は、EV_NULL
が格納される。
TXT_OUT
の場合は、常に変換領域の表示はクリアされ、
未確定文字列が残っている場合は、mode
の
TXT_DISP
がセットされる。
確定文字列の処理後に、redisp_text()
で変換領域の再表示を行わなわなかった場合は、
次の read_text()
で変換領域が再表示されることになる。
TXT_SCRL
の場合は、
常に変換領域の表示はクリアされ、mode
の TXT_DISP
がセットされる。
この場合、変換領域が描画環境の visrect
に入るようにスクロールを行う必要がある。
スクロール後に、redisp_text()
で変換領域の再表示を行わなわなかった場合は、
次の read_text()
で変換領域が再表示されることになる。
TXT_EVT
指定でない時は、EV_KEYDWN、EV_AUTKEY
以外のイベントで未確定文字列は確定されるため、
TXT_EVT
の場合、
通常、TXT_OUT
も同時にセットされる。
TXT_CNV
は状態を示すもので、未確定文字列が残っている場合は、
常にセットされる。
TXT_NOIMG
は状態を示すもので、
イメージが復帰されなかった場合に常にセットされる。
この場合、アプリケーション側で変換領域の縮小部分の再表示を行うことが望ましい。
read_text()
の動作を以下に示す。
mode
の TXT_DISP
がセットされている場合は、
未確定文字列、 またはヌル選択 ( 文字カーソル )
の表示を行い、TXT_DISP
をリセットする。
この処理は、確定文字列が発生し、かつ未確定文字列が残っている場合、
または変換領域が描画環境の visrect
をはみ出ているため表示できなかった場合に、
未確定文字列の再表示のために使用される。
*evt
で指定したイベントをTIPの入力としてかな漢字変換処理を行う。
EV_NULL
の時 :
TXT_WAIT
指定時はイベントの取り出しを行い、
TXT_NOWAIT
指定時は、
何もせずに TXT_NONE
の関数値でリターンする。
TXT_WAIT
指定時で、
取り出したイベントが EV_NULL
または
EV_KEYUP
の場合は、
再度イベントの取りだしを行う。
この時、evt_loop()
関数で定義された
IDLE
処理関数が存在する場合は、
IDLE
処理関数を実行し、
その後カレットの点滅を行う。
EV_KEYDWN
/ EV_AUTKEY
以外の時 :
TXT_EVT
指定時は、単に TXT_EVT
の関数値でリターンし、
TXT_EVT
指定でない場合は、
未確定文字列を確定する。その結果、
確定文字列が発生した場合は、変換領域の表示をクリアし、
( TXT_OUT
| TXT_EVT
)
の関数値でリターンする。
確定文字列が発生しなかった場合は単に TXT_EVT
の関数値でリターンする。
EV_KEYDWN
/ EV_AUTKEY
で不正なキーコードの時 :
TXT_KEY
の関数値でリターンする。
未確定文字列が存在する場合は、
TXT_KEY
指定の場合のみ、TXT_KEY
の関数値でリターンし、TXT_KEY
指定でない場合は、無視される。
mode
の TXT_DISP
をセットし、
TXT_OUT
の関数値でリターンする。
TXT_POS
指定時で、
epos
が変化した場合は、TXT_POS
の関数値でリターンする。visrect
をはみでる場合は、
変換領域の表示をクリアして、 mode
の TXT_DISP
をセットし、
TXT_SCRL
の関数値でリターンする。
TXT_WAIT
指定時は、イベントを取り出し、
(2)の処理を繰り返す。TXT_NOWAIT
指定時は、TXT_NONE
または、
TXT_POS
の関数値でリターンする。
*evt
には、TXT_EVT
, TXT_KEY
の場合は、
対象のイベントが格納され、
その他の場合は、EV_NULL
が格納される。
また、未確定文字列が残っている場合には、関数値には、TXT_CNV
が常にセットされる。
read_text()
の変換領域の表示の方法を以下に示す。
クリッピング : | 描画環境に設定されているすべてが有効 特に、変換領域が visrect をはみ出る場合は、
変換領域を更新しない |
文字サイズ : | 描画環境に設定されている大きさ |
文字フォント : | 描画環境に設定されているフォント |
文字属性 : | 描画環境に設定されている属性 |
文字間隔 : | 描画環境に設定されている属性 |
文字色 : | 描画環境に設定されている色 |
変換領域枠 : | 指定した色 |
変換領域背景 : | 指定した背景パターン |
対象文節背景 : | 変換領域枠と同じ色 |
対象文節文字色 : | 指定した色 |
mode
の TXT_DISP
がセットされるため、
次の read_text()
の実行時に未確定文字列が表示される)。
TEXTPORT
の car
で示されるカレット構造体を使用して、
変換領域の状態に応じた表示が行われる。
すなわち、未確定文字列が存在しない状態では、
spos
の位置に文字カーソルとして表示され、
未確定文字列が存在している状態では、
変換領域の現在の位置にカレットが表示される。TXT_OUT
でリターンした場合、
および TXT_CNV がセットされていない場合は、カレットの表示は消去されている。read_text()
を実行する前にカレットを消去する必要がある。TX_WAIT
指定時のみ、read_text()
で行われるため、
TXT_NOWAIT
指定時はアプリケーションがこのカレットの点滅を
idsp_car()
により行う必要がある。
spos
は、変換領域枠の左下の座標値を指定し、
epos
は変換領域枠の右下の座標値となる。
TXT_OVER
モードの場合は、 変換領域枠の右下に1ピクセル幅の影が表示される。
|
W redisp_text(TEXTPORT *text)
TEXTPORT *text テキスト入力ポート
リターン状態コード(TXT_SCRL / TXT_NONE)
text
で指定したテキスト入力ポートに未確定文字列が存在する場合、
未確定文字列の表示を行い、text->epos
を更新し、
text->mode
の TXT_DISP
指定をリセットする。
未確定文字列が存在しない場合は何もしない。
変換領域の表示が描画環境の visrect
をはみでる場合は、
変換領域の再表示を行わずに、TXT_SCRL
の関数値でリターンする。
この場合は、text->mode
の TXT_DISP
指定はリセットされない。
その他の場合は、TXT_NONE
の関数値でリターンする。