戻る
SUBJ:【不定期連載】LHAPI入門 3 この連載は、HP100/200LX(以下100LXと表記)の内蔵インターフェース ルーチンであるLHAPIの入門です。 今回はLHAPIを使用する上で必要な構造体について解説します。 『お詫び』 ISH会議室にアップしたサンプルプログラム1の中で使用した構造体名や 関数名の一部が古い名称になっていました。cap2.hの内部でdefineされて いるため間違いでは無いのですが、今回説明する構造体名と食い違ってい ます。以下の名称に読み替えてください。 CAPBLOCK → LHAPIBLOCK InitializeCAP → InitializeLHAPI ReactivateCAP → ReactivateLHAPI DeactivateCAP → DeactivateLHAPI ============ ここから ============= 4 構造体 LHAPIを使用する上で必要な構造体が5種類あります。LHAPIを使用した ソースコードを読む際にこれらの知識が必要となりますので、以下で解説 します。 ・LHFKEY構造体 ファンクションキーを定義するための構造体です。配列として定義し ます。 typedef struct LHsFKey { PLHRES Title; PLHFUNC Handler; UCHAR KeyNum; UCHAR Style; } LHFKEY; Title : ファンクションキーのラベルです Handler: ファンクションキーの動作やコマンドのハンドラです KeyNum : ファンクションキーの番号です 1〜12, FKEY_SHIFT+(1〜12), FKEY_ALT+(1〜12), FKEY_CTRL+(1〜12) が有効で、最後のファンクションキー の場合は FKEY_LAST を加えます Style : ファンクションキーのスタイルです 0 :通常の動作をします FKEY_SENDMSG :Handlerで指定したCOMMANDメッセージ を送信します FKEY_CREATEWND:HandlerにはWindow構造体へのポインタ を定義しておき、Windowをcreateし、 フォーカスをセットします。DialogBox の表示などに使います ・LHMENU構造体 メニューを定義するための構造体です。配列として定義します。トッ プメニューと各ポップダウンメニューはそれぞれ配列を構成します。各 配列の最後の要素は、0で埋められたLHMENU構造体になります。 typedef struct LHsMenu { PLHRES Title; PLHFUNC Handler; UINT HotKey; UINT Style; UCHAR Help; } LHMENU; Title : メニュー項目のラベルです 文字の前に"&"を付けると下線が表示されます Handler: LHMENU構造体へのポインタ(プルダウンメニューの場合)や 動作させるコードへのポインタ、ID番号(メニューの場合) や、LHWINDOW構造体へのポインタ(WIndow作成の場合)です HotKey : ホットキーのスキャンコードです Style : メニューのスタイルです MENU_GRAY :メニュー項目をグレイにします MENU_INVISIBLE:メニュー項目を不可視にします MENU_CHECKED :チェックマーク付きのメニュー項目を表示 します MENU_BARBEFORE:項目の前にセパレートバーを挿入します MENU_SENDMSG :直接ハンドラをコールする代わりに親Window にHandlerにセットしたパラメータでCOMMAND メッセージを送信します MENU_PULLDOWN :この項目をプルダウンメニューにします MENU_CREATEWND:HandlerにはWindow構造体へのポインタ を定義しておき、Windowをcreateし、 フォーカスをセットします。DialogBox の表示などに使います MENU_ELLIPSIS :DialogBoxを表示することの目印用に項目 名の後に"..."という文字列を加えます MENU_USER :この指定以降はアプリケーション用の予約 領域になります Help : このメニュー項目用のヘルプインデックス番号です NO_MENUはこの項目にヘルプがないことを意味します ・LHWINDOW構造体 Windowを定義するための構造体です。Windowはインターフェース構成 上の基本単位です。一時には一つのWindowがフォーカスされ、定められ たホットキーが取り扱われ、メニューとファンクションキーが有効に なります。 アプリケーションは各WindowをLHWINDOW構造体で定義します。殆どの Windowは実行前に完全に定義されますが、LHAPIが実行中に定義するもの もあります。LHAPIがWindow作成のためにメモリを確保することはありま せんので、アプリケーションで確保してください。 LHWINDOW構造体の一部はアプリケーションからアクセスできますが、 一部はLHAPIからのみ変更されます。 typedef struct LHsWindow { /**** アプリケーションからアクセスされる部分 ****/ PLHCLASS Class; int x, y, w, h; PLHRES Title; PLHDATA Data; UINT LogicalSize; ULONG Style; struct LHsWindow _near *Parent; PLHFKEYS Fkey; PLHMENU Menu; UCHAR Help; UCHAR Status; UINT Selection; UINT WindowTop; UINT Font; /**** LHAPIに管理され変更される部分 ****/ struct LHsWindow _near *NextWnd; struct LHsWindow _near *PrevWnd; } LHWINDOW; Class : クラスハンドラコードへのニアポインタかLHAPIが提供 する基本クラスの内部テーブルへのハンドラを指定し ます。 x,y : Windowの左上隅の画面上での位置です STYLE_XYRELATIVEを指定した場合、親Windowの左上隅 からの相対値となり、指定しない場合は画面上での絶 対値となります w,h : Windowのサイズです STYLE_WHCHARを指定した場合、文字単位のサイズ指定 になります この場合のサイズにはWindowのタイトルや枠線は含ま れません Title : 名称を収納した領域へのポインタを指定します 通常、この名称は画面上に表示されますが、総ての Windowタイプで必要とされるわけではありません Data : Windowが変更するデータ領域へのポインタです 意味とフォーマットについては各クラスで異なります LogicalSize: データ領域のサイズです Style : Windowのスタイルです 総てのクラスに共通のスタイルと特定のクラス向けの スタイルが存在し、ここでは前者のみ列挙します STYLE_XYRELATIVE :Windowの位置を親Windowからの 相対的な位置にします STYLE_WHCHAR :Windowのサイズ指定をピクセル 単位ではなく文字単位にします STYLE_NOBORDER :枠線無しのWindowを表示します STYLE_PUSHBUTTON :DialogBoxハンドラが正常に押し ボタン処理を行えるようにPushButtonクラ スでセットします STYLE_RADIO :DialogBoxハンドラが正常に処理 を行えるように自動的にRadioButtonクラ スでセットされます STYLE_CHECKBOX :DialogBoxハンドラが正常に処理 を行えるように自動的にCheckBoxクラスで セットされます STYLE_DATETIME :表示された日時が正しいシステ ム日時に更新されるようにDateTimeクラス で自動的にセットされます STYLE_COMBOLIST :ComboBoxの一部のListBoxの為に アプリケーションでセットします STYLE_COMBOEDIT :ComboBoxのLHWINDOW構造体が実 際にはComboBoxのEdit部分の為の構造体で あることを知らせるために自動的にComboBox ハンドラにセットされます STYLE_GRAY :Windowをグレイ表示します STYLE_LEAF :Windowの繋がりから子Windowに DESTROYメッセージが流れるのを妨げ、 Menuフィールドを無効にします DialogコントロールやターミナルWindow に使用します Windowの繋がりを破壊してしまうため、 安全と確認できるときだけ使用してくだ さい STYLE_NOTIFY :NOTIFY_CHILDKILLEDと NOTIFY_CHILDCHANGEDメッセージで状態が 変化した際に親Windowに通知するように 子Windowに知らせます STYLE_NOFOCUS :Windowがフォーカスされない ようにします STYLE_SAVEUNDER :Windowの背景を保持し、終了時 に復帰させます STYLE_INVISIBLE :Windowを不可視にします STYLE_PUSHB_WIDTH :Dialogbox内の各PuchBottonの幅 を自動的に計算してセットするように DialogBoxハンドラに知らせます PushBottonの幅は各PushBottonの中で最も 長いラベルから計算されます このスタイルは各PushBottonではなく DialogBoxにおいてセットされます STYLE_NO_PARENT_KEY:受信したキー操作のうち、使用 しなかったものを親Windowに送りません STYLE_NOSHADOW :DialogBoxとMessageBoxでWindow の枠線を影無しで表示します Parent : 親Windowを指定します Windowの親子関係は以下の場合に使用されます 1 Window間のつながりが分からなくてもメッセージを 送る為 2 メニューとファンクションキーをスタックする為 3 ある動作が一度で行えるようにWindowにレベルを設 定するため(親Windowの削除や全子Windowの削除等) Fkey : LHFKEY構造体の配列へのポインタかPARENT_FKEYS, NO_FKEYSのいずれかを指定します PARENT_FKEYSは親Windowのファンクションキー定義を そのまま使用することを意味し、NO_FKEYSはファンク ションキーを使用しないことを意味します Menu : LHMENU構造体へのポインタかPARENT_MENU, NO_MENUの いずれを指定します PARENT_MENUは親Windowのメニュー定義をそのまま使用 することを意味し、NO_MENUはメニューを使用しないこ とを意味します Help : ヘルプスクリーン番号を指定します NO_HELPを指定すると、このWindowはヘルプを表示しま せん Status : Windowの状態を示します Editクラスでの挿入/上書きや文書変更フラグや、他の WIndowでの予約用に使用します Selection : カーソル情報で、WIndowによって意味合いが変わります Editクラスではカーソルの位置を意味し、ListBoxと ComboBoxではカレントの行を意味します WindowTop : 表示される最初の領域を示します Editクラスでスクロール可能な一行エディタの場合は Windowに表示される最初の文字を指します MultiEditクラスの場合は表示される最初の行を指し、 ListBoxクラスでは表示される先頭の文字列を指します Font : デフォルトフォントのビットマップIDを示します FONT_DEFAULT:Windowの表示時にSetDefaultFontで指 定されているデフォルトフォントを使用 します TitleBarクラスではデフォルトのフォン トに関係なくFONT_SMALLが使用されます FONT_PARENT :親Windowと同じフォントを使用します FONT_SMALL, FONT_NORMAL, FONT_LARGE: 指定したフォントを使用します NextWnd,PrevWnd : Windowリストでの前後のWindowのポインタを指定する 為に内部で使用されます ・LHWINDOW構造体 MultiEditクラス用のデータフィールド構造体です。MultiEditクラス で使用するには標準のLHWINDOW構造体では十分ではないことから、この 構造体が必要になりました。LHWINDOW構造体のフィールドも総て有効で あり、MultiEditクラスで使用されます。 typedef struct LHsEditData { PLHFARDATA Buffer; PLHFARDATA SaveBuffer; UINT _far * _near *LineStarts; UINT MaxLines; UINT WrapLen; UINT CurrentCol; UINT CurrentLine; UINT NumLines; UINT TextLen; } LHEDITDATA; Buffer : 実際に編集するテキストデータバッファへのポインタ です SaveBuffer : ユーザーが編集を開始した際に待避されるオリジナル のコピーを収納したバッファへのポインタであり、 [ESC]キーの押下により回復します NULLをセットした場合、LHAPIによる待避は行われず、 回復も行われません LineStarts : バッファ内の各行の先頭を指すオフセット値を収納し た配列への間接的ポインタです 配列の要素が総て使用された場合、最後の行以降に入力 することはできません このフィールドはMultiEditクラスのハンドラにより初 期化され使用されます MaxLines : 入力可能な最大行数を設定します この値はLineStarts配列のサイズと同じです WrapLen : Window内において各行がワードラップする桁数を設定 します CREATEメッセージが発行される前に0に設定した場合、 MultiEditクラスのWindowの幅に自動的に設定されます CurrentLine, CurrentCol : 編集するテキストの先頭からの相対的なカーソルの現 在位置の行と桁がセットされます このフィールドはMultiEditクラスのハンドラにより初 期化され使用されます NumLines : エディットバッファ内の現在位置の行番号がセットさ れます このフィールドは1からMaxLinesの価をとり、MultiEdit クラスのハンドラにより初期化され使用されます TextLen : 文字列の最後のNULLを含まない、文字列の文字数がセッ トされます このフィールドはMultiEditクラスのハンドラにより初 期化され使用されます ・LHAPIBLOCK構造体 アプリケーションがWindowを管理するための構造体です。各アプリ ケーションはLHAPIBLOCKを一つ定義しておかねばならず、Window操作の 軌跡を保持します。LHAPIはアプリケーションの初期化中とタスクスイッ チされて制御が戻った後に、ブロックの位置を通知されます。 アプリケーション自身はLHAPIBLOCK構造体を変更したり覗き見たりする ことはできません。アプリケーションが情報を必要とする場合は、専用の LHAPI関数を通じて得ることができます。 typedef struct LHAPIsBlock { PLHWINDOW FirstWnd; PLHWINDOW LastWnd; PLHWINDOW FocusWnd; UINT BeginHighlight; UINT EndHighlight; UINT Status; UCHAR UndoBuffer[128]; PLHFKEYS FkeyPtr; UCHAR _far *ScreenSave; UINT ScreenSaveStart; UINT ScreenSaveEnd; int ErrorNum; PLHFUNC ErrorHandler; UINT MenuFont; UINT DefaultFont; UINT HelpFkey; PLHWINDOW CurrentDialog; LHWINDOW TopMenuWnd; LHWINDOW PopMenuWnd1; LHWINDOW PopMenuWnd2; UINT Reserved; } LHAPIBLOCK; FirstWnd : LHAPI Windowリストの最初のWindowがセットされ ます LastWnd : Windowリストの最後のWindowがセットされます 新しいWindowが画面に加わった場合、このフィー ルドが変更されます FocusWnd : フォーカスされたWindowがセットされます BeginHighlight : ハイライトされた領域の先頭へのポインタがセッ トされます 各クラスにより意味合いが変わり、フォーカスさ れるWindowが替わる度にリセットされます EndHighlight : ハイライトされた領域の末尾へのポインタがセッ トされます Status : 現在は使用されていません UndoBuffer : テキスト編集用の一回分のアンドゥバッファです デフォルトのUndoBufferはLHAPIにより確保され ます アプリケーションはより大きな領域を確保して SetUndoBufferサービスに渡すことも可能です FkeyPtr : カレントのLHFKEY構造体へのポインタです ScreenSave : InitializeLHAPIにより設定された画面スタック 領域へのポインタです このバッファはLHAPI自身により確保され、変更 されることはありません ScreenSaveStart : ScreenSave用バッファの次に使用可能なメモリへ のオフセット値です このインデックスは画面が待避、回復する度に更 新されます ScreenSaveEnd : ScreenSave用バッファの合計バイト数です このインデックスはInitializeLHAPIで設定された 後、変更されることはありません ErrorNum : Window作成失敗のエラー番号がセットされます ErrorHandler : エラー時に起動されるルーチンがセットされます TopMenuWnd : トップレベルのMenuWindowのLHWINDOW構造体が セットされます Menuキーが押下された際に自動的にセットされ ます PopMenuWnd : ポップダウンMenuWindowのLHWINDOW構造体がセッ トされます CurrentDialog : (表示されている)現在のDialogを指すPLHWINDOW がセットされます DefaultFont : Windowで使用されてるFONT_DEFAULTに定義された デフォルトのフォントのIDがセットされます HelpFkey : アプリケーションで定義されたHelp表示のための キーコードがセットされます このフィールドはLHAPI内部で使用されるとともに SetHelpFKeyサービスを通じて設定することが可能 です ============ ここまで ============= 今回も第二回に引き続き資料性の高い回になりました。 一部(大半?)に怪しい部分がありますので、間違いに気付いた方は ご指摘ください。 次回は、サンプルプログラムの解説を行います。 質問、要望等は大歓迎ですので、気軽にお寄せ下さい。 どこかに時間が売っていないものか... JCG00070 Brahma でした
All contents and programs Copyright 1996,97,98 (C) by Masaki " Brahma " Tsumori all rights reserved.