〜 オブジェクト 〜
座標から行番号・インデクスを割り出す (要USER32.DLL)

マウスカーソル位置の文字位置や行番を知ることのできるサンプルです。
座標からの変換は、エディットボックスへメッセージを送ることだけで知ることができるので、
HSP2はobjsend命令、HSP3からはsendmsg命令で取得してみます。
使用するメッセージコードは「EM_CHARFROMPOS(=0x00D7)」というもので、

HSP2「objsend オブジェクトID, 0x00D7, 不使用(=0), 座標(変数), 1」 HSP3「sendmsg オブジェクトハンドル, 0x00D7, 不使用(=0), 座標」と指定します。

システム変数statの下位2バイトは文字インデクス、上位2バイトは行番号がセットされるので、 取り出しは「インデクス = stat & 0xFFFF」「行番号 = stat >> 16」としましょう。 p5の座標は、下位2バイトにX座標・上位2バイトにY座標を1つにまとめて指定する必要があるので、 「座標 = Y座標 << 16 + X座標」という感じでまとめておきましょう。 尚、システム変数mousexmouseyでは、エディットボックス上の座標が取得できないため、 下記のサンプルではコチラで紹介している命令・関数も併用しています。 補足ですが、EM_CHARFROMPOSの解説ページを見ると、範囲外の場合は−1が返るとなっていますが、 コレは符号付2バイトの場合であり、HSPの4バイト変数にセットされる場合は、65535となります。

getmousepos 格納変数, 取得座標
格納変数取得座標の受取先変数を指定する。
取得座標取得する座標(0:X 1:Y)のいずれかを指定する。

getpushedindex 格納変数, オブジェクトID, タイプ
格納変数取得値の受取先を指定する。
オブジェクトID取得する対象オブジェクトIDを指定する。
タイプ取得するタイプ(0:行番号 1:インデクス)を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
	ll_libload user, "user32.dll"
	ll_getproc ScreenToClient, "ScreenToClient", user

#module
#deffunc getmousepos val, int
	mref mp, 16 : mref xy, 1
	mref bmscr, 67
	ginfo 0
	i = prmx, prmy
	ll_getptr i : ll_ret ptr
	prm = bmscr.13, ptr
	ll_callfunc prm, 2, ScreenToClient@
	mp = (xy ! 0)
	mp = i.mp
	return

#deffunc getpushedindex val, int, int
	mref rint, 16 : mref id, 1 : mref type, 2
	getmousepos mx, 0
	getmousepos my, 1
	i = (my << 16) + mx
	objsend id, 0x00D7, , i, 1
	rint = stat >> ((type ! 0) * 16) & 0xFFFF
	return
#global

	sdim buf, 256
	buf  = "EM_CHARFROMPOSは指定座標に最も近いインデクスを返します\n\n"
	buf + = "このサンプルは、クリック座標の行番号及び文字インデクスを取得します。\n"
	buf += "エディットボックス上でのマウス座標はgetmouseposモジュール命令を使いましょう。"
	objmode 2
	mesbox buf, winx, winy
	repeat
		wait 5
		stick key, 256
		if key & 256 : gosub *click
	loop

*click
	getpushedindex i.0, 0, 0
	getpushedindex i.1, 0, 1
	if i ! 0xFFFF {
		title "行:" + i.1 + " インデクス:" + i
	} else {
		title "範囲外です"
	}
	return

座標 = getmousepos(取得座標)
座標取得した座標の受取先を指定する。
取得座標取得する座標(0:X 1:Y)のいずれかを指定する。

受取先 = getpushedindex(オブジェクトID, タイプ)
受取先取得値の受取先を指定する。
オブジェクトID取得する対象オブジェクトIDを指定する。
タイプ取得するタイプ(0:行番号 1:インデクス)を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#uselib "user32.dll"
#func  global ScreenToClient "ScreenToClient" int, var

#module
#defcfunc getmousepos int mode, local i
	i = ginfo(0), ginfo(1)
	ScreenToClient hwnd, i
	return i(limit(mode, 0, 1))
 
#defcfunc getpushedindex int id, int type, local i
	sendmsg objinfo(id, 2), 0x00D7, , (getmousepos(1) << 16) + getmousepos()
	return stat >> (type ! 0) * 16 & 0xFFFF
#global

	sdim buf, 256
	buf  = "EM_CHARFROMPOSは指定座標に最も近いインデクスを返します\n\n"
	buf + = "このサンプルは、クリック座標の行番号及び文字インデクスを取得します。\n"
	buf += "エディットボックス上でのマウス座標はgetmouseposモジュール命令を使いましょう。"
	objmode 2
	mesbox buf, ginfo_winx, ginfo_winy
	repeat
		wait 5
		stick key, 256
		if key & 256 : gosub *click
	loop

*click
	if getpushedindex(0, 0) ! 0xFFFF {
		title "行:" + getpushedindex(0, 1) + " インデクス:" + getpushedindex(0, 0)
	} else {
		title "範囲外です"
	}
	return