sendmsg命令 チップ集 (3)

Last Update : 2007/06/xx

ウィンドウ関連 || オブジェクト関連1 || オブジェクト関連2

入力ボックス・メッセージボックス

 内部的にはエディトコントロールというオブジェクトです。要は1行ボックスか複数行ボックスかの違いで、HSPではinput命令とmesbox命令の2命令で用意されてます。エディトコントロール向けのウィンドウメッセージは「EM_〜」という名前ではじまり、40個ほどあります。MSDNのページ(英語)で一覧を確認できます。

 sendmsg命令の第1パラメータで指定するオブジェクトのウィンドウハンドル値は、objinfo関数を利用して取得します。

入力ボックスの編集無効化

 入力ボックスやメッセージボックス内を編集できないよう灰色表示(使用不可状態)に切り替えます。

 → HSP3 オブジェクト編 2 (入力ボックス・編集無効)

入力ボックスのパスワードボックス化

 入力した文字列を「*」(アスタリスク)で置き換えて表示する入力ボックス(input命令)の表示です。

 → HSP命令解説講座 (input命令・パスワードボックス)

メッセージボックス 雑多スクリプト

;	エディトコントロール雑多スクリ (by Kpan)

#uselib "user32"
#func PostMessage "PostMessageA" int, int, int, int

	notesel a
	noteload "readme.txt"

	mesbox a, 600, 100
	hMesbox = objinfo(stat, 2)

	button "1行取得", *check1
	button "行数取得", *check2
	button "スクロール", *check3
	button "マージン", *check4

	stop

*check1
;	現在のカーソル行を取得 (EM_LINEFROMCHAR)
	sendmsg hMesbox, $C9, -1
	linev = stat

;	文字列が返る変数領域を確保
	sdim buf, 512

;	変数領域の最初のバイト位置に確保したサイズを指定しておく
	wpoke buf, , 512

;	行文字取得 (EM_GETLINE)
	sendmsg hMesbox, $C4, linev, varptr(buf)
	mes buf

	stop

*check2
;	全体の行数取得 (EM_GETLINECOUNT)
	sendmsg hMesbox, $BA
	mes stat

	stop

*check3
#define SB_LINEUP 0		; 1行上に
#define SB_LINEDOWN 1	; 1行下に
#define SB_PAGEUP 2		; 1ページ上に
#define SB_PAGEDOWN 3	; 1ページ下に

;	縦スクロール移動 (EM_SCROLL)
	sendmsg hMesbox, $B5, SB_PAGEDOWN

	stop

*check4
#define EC_LEFTMARGIN 1	; 左側
#define EC_RIGHTMARGIN 2 ; 右側

#define ctype MAKELONG(%1,%2) (%1 & $FFFF | %2 << 16)

;	左右マージン指定 (EM_SETMARGINS)
;	wparam値: 左 or 右 or 両方組み合わせ
;	lparam値: 上位ビット左側px、下位ビットに右側px
	PostMessage hMesbox, $D3, EC_RIGHTMARGIN, MAKELONG(10, 50)

	stop

^

リストボックス・コンボボックス

 リストボックスのウィンドウメッセージは「LB_〜」ではじまります。MSDNのページ(英語)を確認してください。一方、コンボボックスのウィンドウメッセージは「CB_〜」ではじまります。MSDNのページ(英語)を確認してください。それぞれ40個ほどの数です。

リストボックスの項目追加/挿入/削除

 リストボックス内の文字列を一気に書き換えることができるHSP標準のobjpm命令を利用しない手法です。

 → HSP3 オブジェクト編 4 (リストボックス・項目文字列の追加や削除)

リストボックスの文字列検索

	a = -1
	listbox a, 100, "HSP1\nHSP2\nHSP3\nHSP4\nHSP5"
	hListbox = objinfo(stat, 2)

	objsize 150

	sdim keyword
	input keyword

;	3系統あり
	button "LB_SELECTSTRING", *search1
	button "LB_FINDSTRING", *search2
	button "LB_FINDSTRINGEXACT", *search3
	stop

;	sendmsg命令の共通部分
;	第3パラ(wparam値)に検索を開始する項目インデックス(0〜) [-1の場合は最初から]
;	第4パラ(lparam値)に検索する文字列 [英文字の大文字小文字区別なし]
;	システム変数statに一致した項目インデックス(0〜)が返る [-1の場合はヒットなし]
*search1
;	前方一致検索+項目選択 (LB_SELECTSTRING)
	sendmsg hListbox, $18C, -1, keyword
	mes stat
	stop

*search2
;	前方一致検索 (LB_FINDSTRING)
	sendmsg hListbox, $18F, -1, keyword
	mes stat
	stop

*search3
;	全文一致検索 (LB_FINDSTRINGEXACT)
	sendmsg hListbox, $1A2, -1, keyword
	mes stat
	stop

リストボックスの項目の高さ変更

 HSPのlistbox命令の場合、このウィンドウメッセージはsendmsg命令(SendMessage関数)で機能しないので、PostMessage関数を利用します。

;	項目の文字自体は、縦方向の中央位置に置かれず。

#uselib "user32"
#func PostMessage "PostMessageA" int, int, int, int

	listbox a, 100, "HSP\nスクリプト\nコード\nリストボックス"
	hListbox = objinfo(stat, 2)

;	LB_SETITEMHEIGHT
;	第4パラのlparam値に高さ (ピクセル単位)
	PostMessage hListbox, $1A0, , 20

リストボックスの特定項目文字列取得

 note〜系命令を使わず、指定した項目インデックスに表示されている文字列をsendmsg命令で取得します。

 → HSP3 オブジェクト編 4 (リストボックス・特定項目の文字取得)

リストボックスの項目数取得

 リストボックスの項目数をsendmsg命令で取得します。

 → HSP3 オブジェクト編 4 (リストボックス・項目数取得)

コンボボックスの項目追加/削除

 コンボボックス内の文字列を一気に書き換えることができるHSP標準のobjpm命令を利用しない手法です。

 → HSP3 オブジェクト編 5 (コンボボックス・項目文字列の追加や削除)

コンボボックスの項目数取得

	combox a, 100, "HSP\n講座\nコンボボックス\n項目数"
	hCombox = objinfo(stat, 2)

;	CB_GETCOUNT
	sendmsg hCombox, $146
	mes stat

コンボボックスの項目の高さ変更

;	項目の文字自体は、縦方向の中央位置に置かれず。

#uselib "user32"
#func PostMessage "PostMessageA" int, int, int, int

	combox a, 100, "HSP\nスクリプト\nサンプル\nコンボボックス"
	hCombox = objinfo(stat, 2)

;	CB_SETITEMHEIGHT
;	第4パラのlparam値に高さ (ピクセル単位)
	PostMessage hCombox, $153, , 20

コンボボックスの特定項目文字取得

 note〜系命令を使わず、指定した項目インデックスに表示されている文字列をsendmsg命令で取得します。

 → HSP3 オブジェクト編 5 (コンボボックス・特定項目の文字取得)
 → sendmsg命令 Tips集 (オブジェクトの表示文字列取得)

コンボボックスのドロップダウンリスト開閉

	combox a, 100, "HSP\n講座\nsendmsg\nコンボボックス"
	hCombox = objinfo(stat, 2)

	button "にょきっ", *open
	stop

*open
;	スクリプトからリストを開く (CB_SHOWDROPDOWN)
	sendmsg hCombox, $14F, 1
	wait 100

;	逆の閉じる
	sendmsg hCombox, $14F

^

Copyright © 2005-2008 Kpan. All rights reserved.