* テキスト表示関係 [[GUIGUI00_man]] #contents ***lib_opentextbox struct LIB_TEXTBOX * lib_opentextbox(int opt, struct LIB_TEXTBOX *textbox, int backcolor, int x_size, int y_size, int x_pos, int y_pos, LIB_WINDOW *window, int charset, int init_char) : 機能:ウィンドウにテキストボックスを貼る。 textboxを0にすると、自動的にmalloc(64 + x_size * y_size * 8)をやって、 そのアドレスを返す。textboxが0でなければ、返値はtextboxがそのまま返る。 ・opt == 0x1000 のとき ウィンドウタイトル専用のテキストボックスを作ります(ウィンドウ一つに対して一 つ必要です)。backcolorとx_posとy_posとinit_charは必ず0にしてください。windowは どのウインドウのタイトルであるかを指定するためのもので、lib_openwindow()の返値 を指定してください。y_sizeは必ず1です。それで、x_sizeにはこのテキストボックスの 文字数を入れます。ここで一つルールがあり、x_sizeは(ウィンドウのx_size / 8 - 10) 以下の値にしなければいけません。長いウィンドウタイトルを付けたければ、この条件 が満たされるようにウィンドウサイズを大きくしておく必要があります。 この関係式はもっと分かりやすくかけます。以下の不等式が成立するようにサイズを 決定してください。 タイトルのx_size * 8 + 80 <= ウィンドウのx_size ・opt == 0 のとき 一般のテキストボックスを作ります。backcolorとinit_charは必ず0で、charsetは必 ず0xc0です。x_sizeとy_sizeはテキストボックスの大きさです。単位はキャラクター単 位で、1キャラクターは、横8ドット、縦16ドットです。x_posとy_posはウィンドウの どこにテキストボックスを貼り付けるかという指示です。テキストボックスの左上の座 標をウィンドウ内座標で示します。単位はドット単位です。ただしx_posは8の倍数を指 定しなければいけません(これは将来のOSASKでは解消される制限です)。y_posにはそ ういう制限はありません。windowでどのウィンドウにそのテキストボックスを貼り付け るかを指定します。やはり、lib_openwindow()の返値を指定してください。当然ですが 、テキストボックスがウィンドウからはみ出さないようにしてください。テキストボッ クスは1つのウィンドウにいくつでも付けられますが、テキストボックスが重なること は許されません。 ウィンドウタイトル用のテキストボックスでなければ、charsetで自分で作ったキャ ラクタセットを指定することも可能。この場合、空白に相当する文字コードをinit_char に指定すること。 参考になるサンプル:helloc4(introa) ***lib_putstring1 void lib_putstring1(int opt, int x, int y, struct LIB_TEXTBOX *textbox, int color, int backcolor, int base, int length, unsigned char *str) : 機能: テキストボックスに文字列を書き込む。改行や折り返しはまったく無い。 optはビットごとに意味がある。 bit0 (0x0001): 0だと文字の背景色はテキストボックスのデフォルトを使う。 backcolorは0を渡すこと。 1だと文字の背景色としてbackcolorを使う。 bit1 (0x0002): 0だとフォントは二色。 1だとフォントはカラー。このときcolorもbackcolorも0を渡す。 bit12-13 0x1000にすると、32bitベース+符号なし8ビットのストリングを 使うという意味。ほかはCでは使いにくそうなので省略。 'むやみに0x0000にしないこと!' bit14(0x4000): guigui00.hでは1に固定されている (マクロに書いてある)。 x,yはテキストボックス中での座標。キャラクタ単位。 textboxはテキストボックスのポインタ。 color, backcolorは文字色と文字背景色。値域は0~15。 lengthは書き込む文字列の長さ。テキストボックスをはみださないこと。 strは符号なし8ビット整数の配列へのポインタ。これにbaseを足したものが テキストボックスにずらずらと書き込まれる。 基本: base=0, strにASCII文字列。 例:lib_putstring1(0x1000, 0, 0, wtitle, 0, 0, 0, 8, "wintitle"); 応用: baseに'0', strに0~9の値など。 ***lib_loadfontset void lib_loadfontset(int opt, int slot, int len, void *font) : 機能: ユーザ定義のフォント集合をスロットに割り当てる。 フォントは8x16 (または8x8) のドットパターンであり、これを羅列したものを フォントセットと呼ぶ。 slotはフォントセットを割り当てるスロット。一つ消費する。 numはフォント数。 fontはフォントセットのポインタ。 ・opt==1 フォントは8x16のモノクロパターンである。1のビットが文字色、0のビットが 背景色となる。1バイト中では上位のビットが左。 (以下未完成) 参考になるプログラム: introc/fnttstc0.c ***lib_loadfontset0 void lib_loadfontset0(int opt, int slot) : 機能: システム内蔵フォントをスロットに割り当てる。 ・opt=0x80000001 slotにANKフォントセットを割り当てる……というのが公式見解だが、その フォントセットはどう見てもANKのK (Kana) が含まれていない。IBMのターミナル フォントが256個入ったフォントセットが割り当てられる。 (以下未完成) 参考になるプログラム: introc/fnttstc0.c ***lib_makecharset void lib_makecharset(int opt, int charset, int fontset, int len, int from, int base) : 機能: フォントセットに含まれるフォントを文字集合空間にマッピングする。 フォントセットに含まれるフォントの一部を文字集合空間にマッピングして、 実際にテキストボックスで使えるようにする。複数のフォントセットをあわせて 使う場合は、一連のスロットでマッピングして最後に終端を定義し、最初の スロットを文字集合のスロットとしてopentextboxに与える。 optは0。fontset, charsetはスロット。 fontsetのfrom番からlen個のフォントを、文字集合charsetのbase番から 割り当てる。 fontset = len = from = base = 0 にすると終端の定義となる。 ***lib_wsjis2gg00jpn0 lib_wsjis2gg00jpn0(len, sjis, gg00jpn, 0x400, 0x4e00) : 機能:シフトJISで書かれた文字列をOSASK自動拡張フォント向けにデコードします。 len:変換結果の長さで, 単位はダブルワードです。 sjis:変換前のシフトJISの文字列のポインタです。 gg00jpn:変換後文字列のポインタです。(たぶん・・) ***lib_loadfontset1 void lib_loadfontset1(0xc0ffffff, 0, int sig) : 機能:OSASKで拡張フォント(日本語全角とか、韓国語など)を使う準備を要請します。 結局はフォントを読み込んでいるだけです。読み込みが完了するとsigを返しますので、 フォントの利用はsigがくるまで待っていてください。成功するとsig、失敗するとsig+1~sig+15を返します。 しかし失敗は原則としてないので気にすることはありません(OSがフォントを読めなくても失敗にはならない)。 sigが返ってきたら、 lib_makecharset(0, slot, 0x0021, 0x1000000, 0, 0); とすることで、slotに拡張フォントのキャラクタセットができます。 これはスロットを4つ使います。もちろん、キャラクタセットの最後には lib_makecharset(0, slot, 0, 0, 0, 0); が必要です。文字コード(フォントコード)0~0xffffffは拡張フォントが使っていますが、 それ以降は自由に使えます。使わない場合も上記のターミネータをお忘れなく。 参考になるプログラム:tviewc5cとか (tviewc5cは http://koya.marokun.net/osask/download.html のtviewc/teditcパックから入手できます) * こめんと欄 #comment