戻る


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.