まずどう動作させたいのか考えてみましょう。
Windowsのペイントソフトで、円を描く場合最初に視点をクリックし、
そのままドラックしていってマウスを離した位置が終点です。
そのためにも、まずは始点と終点の位置を取得するためのスクリプトを考えます。
oncmd gosub *leftclick_down,$00000201
oncmd gosub *leftclick_up,$00000202
stop
oncmd命令によって、HSPウィンドウは左クリックを押した位置と、離した位置を取得するようになります。
マウスクリックが発生した場合、自働的に指定のラベルへ飛ぶのでそこで処理を書きます。
*leftclick_down
mp_sx = lparam & 0xFFFF //始点X
mp_sy = (lParam >> 16) & 0xFFFF //始点Y
return
*leftclick_up
mp_ex = lparam & 0xFFFF //終点X
mp_ey = (lParam >> 16) & 0xFFFF //終点Y
mes "始点X:"+mp_sx+" 始点Y:"+mp_sy+" 終点X:"+mp_ex+" 終点Y:"+mp_ey
return
これで始点と終点の位置が取得できました。あとは円を描画するだけですが、ひとつ問題が
あります。HSPの標準関数であるcircleを使って、Windowsのペイントのようなドラッグ時の
円の形を確認する仕組みを再現しようとすると、次々に円が描画されてしまい。丸だらけに
なってしまいます。なので、そこだけWin32APIを使うことになります。円を描画するには、
◇Ellipse
1 個の楕円を描画します。指定された外接長方形の中心が楕円の中心になります。
現在のペンを使って楕円を描画し、現在のブラシを使って塗りつぶします。
Ellipse関数を使用します。
#uselib "gdi32"
#func Ellipse "Ellipse" int,int,int,int,int
更に、先頭の行にWin32APIを使用するためこれら命令を挿入します。
そして、いろいろがんばることによって実現できます。
#define mp_ex point.0
#define mp_ey point.1
#uselib "gdi32"
#func Ellipse "Ellipse" int,int,int,int,int
#func SelectObject "SelectObject" int, int
#cfunc GetStockObject "GetStockObject" int
#func SetROP2 "SetROP2" int,int
#uselib "user32"
#func InvalidateRect "InvalidateRect" int,sptr,int
#func SetCapture "SetCapture" int
#func ReleaseCapture "ReleaseCapture"
#func ScreenToClient "ScreenToClient" int,sptr
oncmd gosub *leftclick_down,$00000201
oncmd gosub *leftclick_up,$00000202
oncmd gosub *mousemove,$00000200
hBnull=GetStockObject($00000005)
dim rp,4
stop
*leftclick_down
dim point,2
point.0=ginfo(0)
point.1=ginfo(1)
ScreenToClient hwnd,varptr(point)
mp_sx = point.0 //始点X
mp_sy = point.1 //始点Y
flag_click=1
SetCapture hwnd
return
*leftclick_up
mes "始点X:"+mp_sx+" 始点Y:"+mp_sy+" 終点X:"+mp_ex+" 終点Y:"+mp_ey
SelectObject hdc, hBnull
SetROP2 hdc, $0000000D
Ellipse hdc, mp_sx, mp_sy, mp_ex, mp_ey
flag_click=0
dim rect,4
rp.0=mp_sx
rp.1=mp_sy
rp.2=mp_ex
rp.3=mp_ey
InvalidateRect hwnd, varptr(rp), 0
ReleaseCapture
return
*mousemove
if flag_click=1{
if rp.0+rp.1+rp.2+rp.3!0{
Ellipse hdc, rp.0, rp.1, rp.2, rp.3
InvalidateRect hwnd, varptr(rp), 0
}
SetROP2 hdc, $00000006
dim point,2
point.0=ginfo(0)
point.1=ginfo(1)
ScreenToClient hwnd,varptr(point)
rp.0=mp_sx
rp.1=mp_sy
rp.2=point.0
rp.3=point.1
SelectObject hdc, hBnull
Ellipse hdc, rp.0, rp.1, rp.2, rp.3
InvalidateRect hwnd, varptr(rp), 0
}
return