戻る
SUBJ:【不定期連載】LHAPI入門 5 この連載は、HP100/200LX(以下100LXと表記)の内蔵インターフェース ルーチンであるLHAPI(Lotus Handheld Application Programming Interface)の入門です。 今回はLHAPIの動作の基本であるメッセージについて解説します。 ============ ここから ============= 6 メッセージ LHAPIはメッセージ駆動で動作します。イベントやキー入力もメッセー ジの一種として取り扱われます。 メッセージは各ウィンドウ間の連絡に用いられます。総てのメッセージ が総てのウィンドウで意味を持つわけではありませんが、使われないメッ セージでも親クラスに渡され意味を為すことがあります。 メッセージを送信する最も一般的な関数はSendMsg関数です。 int SendMsg(PLHWINDOW Window,UINT Message,UINT Data,UINT Extra) メッセージはDataとExtraというオプションを持ち、同じメッセージでも 意味が変わる場合に用いられます。例えば、KEYSTROKEメッセージの際の キーコードであり、COMMANDメッセージの際のコマンド番号です。 メッセージには以下の種類があります。 KEYSTROKE : フォーカスされたウィンドウにキー入力を送ります DRAW : ウィンドウに再描画を指示します Dataには描画する領域を指定します CREATE : ウィンドウの作成を指示します DESTROY : ウィンドウの削除を指示します TERMINATE : 全ウィンドウにアプリケーションの終了を送ります ACTIVATE : 全ウィンドウにタスクスイッチから復帰したことを連絡 します SETFOCUS : 特定のウィンドウをフォーカスします LOSEFOCUS : 特定のウィンドウのフォーカスを失わさせます 他のウィンドウがフォーカスを得た際にはシステムが自動 的に行います NULL : E_NONEイベントかNULLメッセージを送ります NOTIFY : 子や親ウィンドウに通知します COMMAND : コマンドを送信します APPEAR : ウィンドウに対し可視化を指示します DISAPPEAR : ウィンドウに対し不可視化を指示します いくつかのメッセージはサブメッセージを持ち、これにより多様な意味 を持たせることができます。サブメッセージはDataに入れて渡されます。 以下に各メッセージのサブメッセージを列挙します。 ・CREATEのサブメッセージ CREATE_NORMAL : ウィンドウを普通に作成します。 CREATE_FOCUS : ウィンドウの作成後に、自動的にSETFOCUSメッ セージを送ります。ExtraがSETFOCUS_NOLOSEでない場合は、その 時点でのフォーカスウィンドウは新しいウィンドウがAPPEARメッ セージを送られる前にLOSEFOCUSメッセージを送られます。これは 新しいウィンドウの一部を古いウィンドウの描画により隠すこと を防ぐためです。ExtraパラメーターはSETFOCUSのサブメッセージ と同じものを使用できます。 ・DESTROYのサブメッセージ DESTROY_NORMAL : 普通にウィンドウを削除し、STYLE_SAVEUNDERが 指定されていない場合は画面上に表示されたウィンドウ総てを 再描画します。 DESTROY_NODRAW : 他のウィンドウの再描画をせずにウィンドウの 削除を行います。但し、STYLE_SAVEUNDERが指定されている場合は そのまま画面が戻されます。これはダイアログボックスのような 親ウィンドウの削除時に子ウィンドウの削除により毎回他ウィン ドウの描画をさせない場合に便利です。 ・DISAPPEARのサブメッセージ DISAPPEAR_NORMAL : DESTROY_NORMALと同じです。 DISAPPEAR_NODRAW : DESTROY_NODRAWと同じです。 ・NOTIFYのサブメッセージ NOTIFY_CHILDKILLED : 特に必要な場合、子ウィンドウが削除され たことを親ウィンドウに通知します。 NOTIFY_UPDATE : ウィンドウ内のデータが変更されたことを アプリケーションからウィンドウに通知します。 NOTIFY_CHILDCHANGED : 子ウィンドウの状態が変わったことを親 ウィンドウに通知します。このメッセージのExtraフィールドには 子ウィンドウのLHWINDOW構造体のアドレスを代入します。 NOTIFY_SORT : ListBoxウィンドウにソートを依頼します。 Extraフィールドにはソート順序(0:昇順、非0:降順)を代入しま す。 NOTIFY_USER : NOTIFY_USERから始まる値をサブメッセージ としてアプリケーション内で定義します。 ・COMMANDのサブメッセージ CMD_DONE : DialogBoxハンドラでのみ認識され、dialogbox ウィンドウに(KEYSTROKE, F10, 0)のメッセージを送ります。 CMD_ESC : DialogBoxハンドラでのみ認識され、自己を DESTROYします。 CMD_DIALOGFOCUS : DialogBoxハンドラでのみ認識され、Extraフィ ールドで指定された値に相当するdialogコントロールにフォーカス を与えます。 CMD_PUSHB_ACTIVE : PushButtonウィンドウに、アクティブになって 定義した動作を行うように命令します。 CMD_USER : CMD_USERから始まる値をサブメッセージとして アプリケーション内で定義します。 ・DRAWのサブメッセージ(ビットマスクの為ORで複合指定が可能) DRAW_TITLE : タイトルを描画させます。 DRAW_FKEYS : ファンクションキーを描画させます。 DRAW_CLIENT : ウィンドウのクライアントエリア(タイトル 枠を除いた部分)やワークスペースを描画させます。 DRAW_CLIENT_UPDATE : カーソル位置以降を描画させます。editウィ ンドウで削除や挿入を行った際に使用します。 DRAW_CLIENT_CHAR : editウィンドウにカーソル位置の文字だけを 描画させます。 DRAW_FRAME : ウィンドウの枠を描画させます。 DRAW_CURSOR : ウィンドウのカーソルを表示させます。 DRAW_USER : DRAW_USERのビットから始まる値をアプリケ ーションで定義します。 DRAW_ALL : ウィンドウの全領域を描画させます。この メッセージはウィンドウを作成した際に自動的に送られます。 ・SETFOCUSのサブメッセージ SETFOCUS_NORMAL : 新しいフォーカスウィンドウがメッセージを受 け取った後に、古いフォーカスウィンドウにLOSEFOCUSメッセージ を送ります。 SETFOCUS_NOLOSE : 古いフォーカスウィンドウにLOSEFOCUSメッセー ジを送るのを抑制します。 SETFOCUS_SELECT : CheckBoxでのみ使用され、フォーカスを得た直 後に[SPACE]を押したと同等の効果を為します。 ・LOSEFOCUSのサブメッセージ LOSEFOCUS_NORMAL : 普通にLOSEFOCUSメッセージを送信します。 LOSEFOCUS_MENU : 作成やフォーカスの付与に先だってmenuウィン ドウにLOSEFOCUSを送信します。 ============ ここまで ============= しばらく休もうかと思っていたのですが、サンプルプログラムを理解 する上でメッセージに関する知識が必要なこと、メッセージの解説は比較 的短くできることから、一気に書きました。 内容的にはただの**ですので、根気だけの問題でしたが。 (^^;) 第四回が少々詰め込み過ぎでしたので、各部分の細かい説明も必要かと 思いましたが、LHAPIのプログラミングはMS-Winによく似ており、それ程 特殊でも無いため省きました。 要望が有れば、もう少しかみ砕いたバージョンも検討します。 一つだけ気になったので解説しますと、本連載ではウィンドウという表 現を多用しています。これは一般的なウィンドウ(枠とタイトルの付いた パネル状のもの)のことを指しているわけではなく(基本クラスにWindow クラスは存在しませんね)、各クラスの実体を指していると考えてくださ い。一般的なオブジェクト指向で呼ぶところのインスタンス、あるいは オブジェクトの意味になります。Windows用語ならコントロールです。例え ば、CheckBoxクラスの実体もウィンドウですし、DialogBoxもウィンドウ です。 多分、皆さんご理解いただけているとは思いますが、私自身が以前混同 して理解するのに時間をかけてしまいましたので、念のため。 次回以降は、各基本クラスの詳細について解説します。五回ぐらいを かけて各基本クラスの詳細と使用例を解説して、本連載は完結する予定 です。 質問、要望等は大歓迎ですので、気軽にお寄せ下さい。 ネタ作りのため次回は少し先です JCG00070 Brahma でした
All contents and programs Copyright 1996,97,98 (C) by Masaki " Brahma " Tsumori all rights reserved.