[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

HSP2.6:OBJSEND


objsend命令リファレンスマニュアル ver1.0

はじめに

このドキュメントは、Hot Soup Processor ver2.4c以降で使用することのできる、 objsend命令についての詳細を解説したものです。objsend命令は、Windowsオブジェクト が使用するメッセージを直接記述できる命令で、用途が広い反面、複雑で面倒な 手続きになることが多いです。Hot Soup Processorを使っていて、通常の命令では どうしても実現できないことや、解決したいことがある場合に参考にしてください。

objsend命令の概要

HSPでは、ボタンや入力ボックスなどのパーツを画面上に配置することができますが、 これらはみな、Windowsが管理するオブジェクト(コントロール)と呼ばれる小さな ウインドゥになっています。これらのオブジェクトは、それぞれ独立したプログラム で動いており、外部からの命令によって動作するしくみになっています。 ボタン・入力ボックス・メッセージボックス・チェックボックス・コンボボックス・ リストボックスといったオブジェクトは、それぞれ専用の命令(メッセージ)によって ある程度のコントロールをすることができます。 objsend命令は、このオブジェクトに直接命令を下すための命令です。 書式は、

objsend p1,p2,p3,p4,p5          オブジェクトにメッセージを送る

        p1=0〜(0) : オブジェクトID指定 
        p2=0〜(0) : オブジェクトに送るWin32メッセージの種類 
        p3=0〜65535(0) : オブジェクトに送るパラメータ(wParam) 
        p4=変数 : パラメータの受け渡しに使用する変数名(lParam) 
        p5=0〜(0) : lParamパラメータのタイプ 

のようになっています。p1で、オブジェクトのIDを指定します。p2で、オブジェクト に送るメッセージ(命令)の種類(コード)を指定、p3で数値のパラメータを、p4には 必ず変数名を記述しなければなりません。p5で、パラメータのタイプを指定します。 p5が0の場合は、p4で指定した変数のアドレス(ポインタ)が渡され、p5が1の場合は、 p4で指定した変数の内容が数値として渡されます。p5を省略した場合には、0になり ます。そして、objsend命令が実行された後には、戻り値がシステム変数statに代入されます。

整理して考えると以下のようになります。

  1. メッセージコード
    パラメータ1(wParam)
    パラメータ2(lParam)
  2. 指定したオブジェクト
  3. システム変数statに結果が返る

最初にメッセージコード・パラメータ1、2の3つがセットになってオブジェクト に送られます。すると、そのメッセージコードやパラメータに応じた動作を オブジェクトが行ない、その結果がシステム変数statに返ります。 オブジェクトの種類ごとに色々なメッセージコードが存在します。そして、 そのメッセージコードごとにパラメータ1、パラメータ2に指定する数値の意味が 違ってきます。ちょうどHSPにも色々な命令と、それに応じたパラメータの指定が あるようにオブジェクトにもまた色々な命令があるのです。

objsend命令の制約・注意

objsend命令は、Windowsオブジェクトにメッセージを送るという直接的な動作をするものです。 間違って使うと、オブジェクトの状態がおかしくなったり、 Windows の動作に影響を与えることにもなるので、十分に注意して使ってください。 また、Windowsのオブジェクトがサポートしていても、HSPからでは使用できない メッセージもありますので、適当なメッセージを送ったりしないでください。

リファレンスの形式

以降のリファレンスでは、次のような形式でメッセージの説明を行なっています。

win32name Win32APIでの名称
Code メッセージコード
wParam パラメータ1
lParam パラメータ2
Type lParamタイプの値
Result 実行後に返される値

これを実際のobjsend命令で使う場合は、

        「 objsend オブジェクトID , Code , wParam , lParam , Type 」

のような順番で記述することになります。 Resultには、実行後にシステム変数statに返される値の内容を示しています。

メッセージボックスへ送るメッセージ

以下のリファレンスは、mesbox命令で表示されたメッセージボックスに対してのメッセージになります。 それ以外のオブジェクトには無効ですので注意してください。

メッセージボックス内のカーソル(キャレット)の位置を取得

win32name EM_GETSEL
Code $b0
wParam 0にする
lParam 現在位置を取得する変数
Type 0
Result 上位16bitに選択スタート位置、下位16bitに選択終了位置

カーソル位置は、全体のテキストの中で0から数えて何byte目(何文字目) かという単位で返されます。

メッセージボックス内のカーソル(キャレット)の位置を設定する

win32name EM_SETSEL
Code $b1
wParam 選択スタート位置
lParam 選択終了位置
Type 1
Result なし

選択スタートと、選択終了位置を指定すると、その範囲が反転して選択 された状態になります。 単にカーソル位置を移動したい場合は、 選択スタートと終了位置に同じ値を指定します。 指定する値は、EM_GETSELと同じく全体のテキストの中で0から数えて 何byte目(何文字目)かという単位になります。 このメッセージでカーソル位置を変更しても、 ウインドゥ内の状態は 変化しません。実際にカーソルが移動した場所に表示をずらすには EM_SCROLLCARETのメッセージを送る必要があります。

メッセージボックス内の表示をスクロールさせる

win32name EM_LINESCROLL
Code $b6
wParam |左右にスクロールさせる文字数
lParam 上下にスクロールさせる行数
Type 1
Result なし

wParamで左右へのスクロール、lParamで上下のスクロールする数を指定します。 スクロールの方向は、マイナスの値か、プラスの値かで決まります。

現在カーソル(キャレット)がある位置を画面内にもってくるようにする

win32name EM_SCROLLCARET
Code $b7
wParam 0にする
lParam 0にする
Type 1
Result なし

wParamで指定した行を、全体のテキストの中で0から数えて何byte目(何文字目)かという単位に変換して値を返す

win32name EM_LINEINDEX
Code $bb
wParam 行の指定
lParam 0にする
Type 1
Result ポジション

行の指定は、一番上の行は0から始まって何番目かという単位で指定します。

wParamで指定した行インデックス(0から始まる)にある文字(byte)数を返す

win32name EM_LINELENGTH
Code $c1
wParam 行の指定
lParam 0にする
Type 1
Result 指定された行の長さ

UNDOをする

win32name EM_UNDO
Code $c7
wParam 0にする
lParam 0にする
Type 1
Result なし

wParamで指定したポジション(テキスト全体の何byte目か)を、行インデックス に変換して値を返す

win32name EM_LINEFROMCHAR
Code $c9
wParam ポジション
lParam 0にする
Type 1
Result 行インデックス

メッセージボックスの書き込み禁止属性の設定をする

win32name EM_SETREADONLY
Code $cf
wParam -1で書き込み禁止、0で解除
lParam 0にする
Type 1
Result 正常に終了すると0以外が返る

wParamで書き込み禁止のon/offを指定します。

メッセージボックスの左マージンおよび右マージンの設定をする

win32name EM_SETMARGINS
Code $d3
wParam 3にする
lParam 上位16bitで右マージン、下位16bitで左マージン設定
Type 1
Result なし

(現在のHSPのバージョンでは、マージンの設定をすると文字がウインドゥ からはみ出ます)

EM_SETMARGINSで設定したマージンの値を調べて返す

win32name EM_GETMARGINS
Code $d4
wParam 0にする
lParam 0にする
Type 1
Result 上位16bitに右マージン、下位16bitに左マージンが返る

メッセージボックスが扱うことができるテキスト量の限界を設定する

win32name EM_SETLIMITTEXT
Code $c5
wParam テキストのリミット指定
lParam 0にする
Type 1
Result なし

wParamで何byteまでのテキストを扱うかを指定します。wParamに0を指定すると、 そのOSでの最大サイズが割り当てられます。 (Windows95では、最大65535までのテキストしか扱うことができません)

EM_SETLIMITTEXTで指定したテキスト量の限界値を調べて返す

win32name EM_GETLIMITTEXT
Code $d5
wParam 0にする
lParam 0にする
Type 1
Result テキストのリミット値

ボタンへ送るメッセージ

以下のリファレンスは、button命令で表示されたボタンに対してのメッセージになります。 それ以外のオブジェクトには無効ですので注意してください。 ボタンにメッセージを送りスタイルを変更することにより、チェックボックスやラジオボタン、 グループボックスなどのまったく外観の違うオブジェクトに変更することが可能です。

チェックボックスのON/OFFステータスを返す

win32name BM_GETCHECK
Code $f0
wParam 0にする
lParam 0にする
Type 1
Result ボタンのチェックステータス

チェックされていれば1が、されていなければ0が返ります。 3STATEのチェックボックスで、非表示(グレイ)であれば2が返ります。

チェックボックスのON/OFFステータスを強制的に設定する

win32name BM_SETCHECK
Code $f1
wParam チェックステータス
lParam 0にする
Type 1
Result なし

wParamに設定値を指定します。0ならOFF、1ならばONになります。 3STATEのチェックボックスで、非表示(グレイ)にするには2を指定します。

ボタンのスタイルを変更する

win32name BM_SETSTYLE
Code $f4
wParam スタイル設定
lParam -1にする
Type 1
Result なし

wParamで変更するスタイルを指定します。

win32name wParam スタイル
BS_PUSHBUTTON $00 通常のボタン
BS_DEFPUSHBUTTON $01 デフォルトボタン(枠が太い)
BS_CHECKBOX $02 チェックボックス
BS_AUTOCHECKBOX $03 チェックボックス(auto)
BS_RADIOBUTTON $04 ラジオボタン
BS_3STATE $05 3ステートチェックボックス
BS_AUTO3STATE $06 3ステートチェックボックス(auto)
BS_GROUPBOX $07 グループボックス
BS_AUTORADIOBUTTON $09 ラジオボタン(auto)
BS_OWNERDRAW $0b 非描画ボタン

button命令は通常、ボタンが押されると指定されたラベルにジャンプします。 BM_SETSTYLEによってボタンスタイルが変更されても基本的には、同じ動作をします。 ただし、BS_GROUPBOXはボタンとして機能しなくなります。 それ以外のチェックボックスやラジオボタンは、ON/OFFのためにクリックした時点でラベルにジャンプします。 その際、(auto)がついているスタイルの場合は 自動的にチェックのON/OFFを行ないます。 (auto)がないスタイルでは、ジャンプした先でON/OFFをさせる処理を自前で行なう必要があります。 ラジオボタンは、2つ以上の選択ボックスから1つだけをチェックするためのオブジェクトです。 これは、(auto)であっても選択したラジオボタンがONに なるだけなので、 他の選択肢をOFFにする処理はスクリプト側で行ないます。 BS_OWNERDRAW(非描画ボタン)は、ボタンとしては絵が描かれませんが、 そのエリアでボタンをクリックすれば反応します。このスタイルに変更した後で、 上から好きな絵(ボタンの絵など)を描画して使うことができます。