sendmsg命令 Tips集 (入力ボックス・メッセージボックス)

Last Update : 2008/03/xx

ウィンドウ 関連 | ボタン・チェックボックス | 入力ボックス・メッセージボックス | リストボックス・コンボボックス

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

 Win32プログラミングではエディトコントロールといいます。HSPでは1行表示をinput命令、複数行表示をmesbox命令として利用できるようにしてます。エディトコントロール向けのウィンドウメッセージは、「EM_〜」という頭文字で始まり、数は40種ほどです。MSDNのページ(英語)で一覧を確認できます。

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

※ Windows XP以降で、エディトコントロール内の文字数のカウントがバイト単位から文字単位に切り替わってます。選択範囲を取得したりする場合にいろいろと不都合がでてくる可能性があります。

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

 入力ボックスやメッセージボックス内を編集できないよう灰色表示(使用不可状態・グレー表示)に切り替えます。ユーザーによる文字入力を受け付けなくなり、表示専用ボックスになります。mesbox命令はパラメータ指定で用意できますが、設置した後の解除が可能です。obj.asモジュールによるobjgray命令やHSP 3.2以降の標準命令であるobjenable命令でも実現できます。

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

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

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

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

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

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

#include "user32.as"	; check4ラベルでのみ必要

	notesel buf
	noteload "readme.txt"

	mesbox buf, 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 data, 512

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

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

	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_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(10, 50)

	stop

 ここではmesbox命令を使ったサンプルですが、input命令に対しても利用できます。

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

#define EM_SETSEL $B1
#define EM_REPLACESEL $C2
#define WM_CUT $300
#define WM_COPY $301
#define WM_PASTE $302
#define WM_CLEAR $303
#define WM_UNDO

	notesel buf
	noteload "readme.txt"

	mesbox buf, 600, 200
	hMesbox = objinfo(stat, 2)

	objsize 100
	button "EM_SETSEL", *setsel
	button "EM_REPLACESEL", *replace
	button "WM_CUT", *cut
	button "WM_COPY", *copy
	button "WM_PASTE", *paste
	button "WM_CLEAR", *clear

	stop

*setsel
;	全文字列選択 (※反転表示として表現されないので注意)
	sendmsg hMesbox, EM_SETSEL, 0, -1
	stop

*replace
;	選択文字列を指定した文字列に置き換え
	sendmsg hMesbox, EM_REPLACESEL, , "へんこー"
	stop

*cut
;	選択文字列を切り取り
	sendmsg hMesbox, WM_CUT
	stop

*copy
;	選択文字をクリップボードにコピー
	sendmsg hMesbox, WM_COPY
	stop

*paste
;	指定位置にクリップボードの文字列を貼り付け
	sendmsg hMesbox, WM_PASTE
	stop

*clear
;	選択文字列を削除
	sendmsg hMesbox, WM_CLEAR
	stop

クリップボードに文字列コピー
 Windowsのクリップボードに指定文字列をコピー転送する裏技的な方法です。普通なら、拡張プラグイン「hspext.dll」のclipset命令か、Win32 API関数を呼ぶことになりますが、隠しのinput命令やmesbox命令を設置しておいて、そこにobjprm命令で文字列を表示、sendmsg命令で「EM_SETSEL」(全選択)と「WM_COPY」(転送)を送信してやります。

//	クリップボード文字列転送

#define	moji "HSPクリップボード♪"

	sdim buf, 128

	pos 100, 100
	input buf, 0, 0		; 表示サイズ0で見えません
	hInput = objinfo(stat, 2)

	button "コピー", *copy

	stop

*copy
	objprm 0, moji

;	EM_SETSEL (文字列の全選択)
	sendmsg hInput, $B1, , -1

;	WM_COPY (クリップボードに転送)
	sendmsg hInput, $0301

↑TOP↑


日本最大のYahoo!オークションで掘り出しものを探しちゃお! (100スタート)円

HSP3 あれこれ | HSP3 オブジェクト | HSP 命令/関数講座

Copyright © 2005-2012 . All rights reserved.