標準命令でスイッチ系・リスト系・エディット系の3種のコントロールを配置できると紹介しましたが、 例えば、スイッチ系にはbutton命令で設置するボタンや、chkbox命令で設置するチェックボックスの他の、 ラジオボタンや3ステートチェックボックスといったコントロールを直接配置する命令は用意されてません。 既存のbuttonやchkboxと別の命令とを組み合わせることで配置できるようになるので、 今回は隠し技とも言えるその別の命令を使って実際に配置してみましょう。 予め断っておきますが、今回紹介する命令や関数は「通常は使わないので覚えておかなくて良い」と ヘルプで但し書きされる程のもので、 ソレらを説明する為には専門用語も多く必要となる為に理解しにくい内容となっている可能性があります。 さて、隠し技とも言えるその命令はというと、 Windowsがプログラマ向けに公開しているSendMessageというAPI関数のラッパーファンクション。 C言語等の別言語で利用可能なAPI関数をHSPでも利用できるようにしたもので、 操作対象のオブジェクトはobjselやclrobj等で使用するオブジェクトIDでは指定できず、 ウィンドウハンドルと呼ばれるオブジェクト毎に割り当てられた識別番号で指定する必要があります。 HSPで配置したオブジェクトにもオブジェクトIDとは別にウィンドウハンドルは割り当てられ、 C言語等で利用できるAPI関数を利用する時はこのウィンドウハンドルを使うことになります。 まずは、このウィンドウハンドルを取得する関数から先に紹介します。
| 情報 = objinfo(オブジェクトID, 取得タイプ) | |||
| 情報 | 指定した取得タイプにより取得した情報の受取先を指定する。 | ||
| オブジェクトID | 取得対象とするオブジェクトのオブジェクトIDを指定する。 | ||
| 取得タイプ |
0:モードとオプションデータ(値 = オプションデータ << 16 | モード) 1:対象オブジェクトが配置されているウィンドウのBMSCR構造体ポインタ 2:オブジェクトのハンドル 3:内部汎用データ(owid) 4:内部汎用データ(owsize) 5-8:代入変数の情報 9-11:コールバックの情報 | ||
typedef struct HSPOBJINFO {
short owmode;
short option;
void *bm;
HWND hCld;
int owid;
int owsize;
HSP3VARSET varset;
void (*func_notice)( struct HSPOBJINFO *, int );
void (*func_objprm)( struct HSPOBJINFO *, int, void * );
void (*func_delete)( struct HSPOBJINFO * );
}
owmodeはタブキースキップする等のモードがセットされています。
optionは未使用で内部オブジェクトは0がセットされています。
*bmはBMSCR構造体と呼ばれるオブジェクトを配置元のウィンドウ情報を指し示し先、
コレは後の章で紹介するもので同一ウィンドウのオブジェクトは全て同じものになってます。
hCldはobjinfo関数で使える唯一と言ってもいい程の情報で後で改めて説明します。
owidはオブジェクトの汎用値…オブジェクトに使ってる変数の値と言う意味ではありません。
owsizeはオブジェクトの汎用サイズ…オブジェクトのサイズと言う意味ではありません。
varsetは次に載せるHSP3VARSET構造体になっています。
最後の3つはコールバック関数に関するもので、
外部DLLを作成する時しか使えるものではないので説明しません。
typedef struct HSP3VARSET {
int type;
PVal *pval;
APTR aptr;
void *ptr;
}
typeはオブジェクトと関連付けてる変数の型コードが入ってます。
変数の型コードはまた後の章で新たなHSPの関数と共に説明をする予定で、この場は割愛します。
*pvalも後の章で説明することになるPVal構造体というもので、この場は割愛します。
aptrは配列データのオフセット…使用してる配列変数の要素番号を示すものです。
*ptrはポインタが格納されます。
objinfo関数で取得するタイプが5〜8と4つあるのは、
4種あるHSP3VARSET構造体のそれぞれの情報を示しているわけですね。
…と、ココまでが「覚えておく必要のない小難しい補足情報」です。
先に「読み飛ばして良い」と書いておいたので見てない方も多いと思いますが、
他のDLL等と連携させることなくHSPだけで完結する人にとって
ほとんど遣う価値のないobjinfo関数で唯一利用できると言ってもいい情報がハンドル値。
HSPOBJINFO構造体の4つ目(objinfo関数のタイプ2)にあるこの情報こそが
C言語等で利用するのに必要なウィンドウハンドルであり、
後に紹介する命令を使うときに必要な情報であると言う訳です。
オブジェクトIDは0から順に割り当てられ、
削除して歯抜けになった後に新しくオブジェクトを配置すると抜けていた番号が再利用されましたが、
ウィンドウハンドルは歯抜けのものが再度使われるのではなく新たなハンドルが割り当てられます。
今回はハンドル値を表示するだけなので載せておくほどの価値はありませんが、
入門講座のサンプルとして載せておきます。
1 2 3 4 5 6 7 8 9 10 |
s = "abc", "def", "ghi" input s.0 mes "オブジェクトID0=" + objinfo(0, 2) input s.1 mes "オブジェクトID1=" + objinfo(1, 2) input s.2 mes "オブジェクトID2=" + objinfo(2, 2) clrobj 1, 1 input s.1 mes "オブジェクトID1=" + objinfo(1, 2) // 別のハンドルが割り当てられている |
1 2 3 4 5 6 7 8 9 10 |
s = 123, 456, 789 input s.0 mes "オブジェクトID0=" + objinfo_hwnd(0) input s.1 mes "オブジェクトID1=" + objinfo_hwnd(1) input s.2 mes "オブジェクトID2=" + objinfo_hwnd(2) clrobj 1, 1 input s.1 mes "オブジェクトID1=" + objinfo_hwnd(1) |
| sendmsg ハンドル, メッセージID, wParam, iParam | |||
| ハンドル | 操作対象のウィンドウハンドルを指定する。 | ||
| メッセージID | 送信するメッセージコードを指定する。 | ||
| wParam | 送信メッセージ特有の1つ目の追加情報を指定する。 | ||
| iParam | 送信メッセージ特有の2つ目の追加情報を指定する。 | ||
1 2 3 4 5 6 7 8 9 |
objsize 100, 20 repeat 3, 1 button gosub "Radio Test" + cnt, *push sendmsg objinfo_hwnd(stat), $F4, $9 // 配置したボタンをラジオボタンスタイルに変更 loop stop *push return |