|
|
2012/10/10(Wed) 19:01:20|NO.49895
windowsに付属のペイントで、「選択」を使った時に出る、四角形でサイズや位置を自由に変更できるGUIはHSPで使えますか?
もしくは、マウスカーソルの変更など、そのGUIのようなGUIを再現する方法を教えて下さい
(マウスが変えたい位置にあったら変更する、という方法でいいんでしょうか?)
使う時は一つしか出さないつもりです
|
|
2012/10/10(Wed) 20:10:37|NO.49897
onclick gosub *click
repeat
color 255,255,255 :boxf
color :boxf x,y,mousex,mousey
redraw 1 :redraw 0
await 10
loop
*click
x=mousex
y=mousey
return
適当ですがこうですか?
マウスカーソルはこちらに
http://lhsp.s206.xrea.com/hsp_mouse.html#3
|
|
2012/10/11(Thu) 12:53:20|NO.49904
マウスカーソルの変更は基本的に、WM_SETCURSORメッセージのプロシージャで行われます。
とくにhsp では、wait または await 命令が実行されている間に、ウィンドウプロシージャの実行、もといデフォルトのカーソルが設定される仕様に成っているので WM_SETCURSORメッセージ以外でSetCursor 関数を使用すると当然の様にちらつきます。
mouse 命令に -1 を指定して SetCursorする方法もありますが、その場合、タイトルバー上に有る場合に判定が面倒に成るデメリットが有ります。
一番無難な方法は、やはり、WM_SETCURSORメッセージ 内で SetCursor 関数を実行する事だと思います。
#include "user32.as"
// nhittest の定数
#const HTCAPTION 2 // タイトルバーの領域内にあります。
#const HTMINBUTTON 8 // アイコン化ボタン内にあります。
#const HTMAXBUTTON 9 // 最大表示ボタン内にあります。
#const HTCLOSE 20 // 「閉じる」ボタン内にあります。
// マクロと定数
#const fontsize 18
#const margin 5
#const sizex 200+margin
#define left margin
#define top py
#define right sizex
#define bottom (py+fontsize)
tx = "IDC_HELP" , "IDC_WAIT" , "IDC_IBEAM" , "IDC_NO" , "IDC_CROSS"
id = $00007F8B , $00007F02 , $00007F01 , $00007F88, $00007F03
py=5
font msGothic,fontsize,1
foreach tx
color 200,200,255:boxf left, top , right , bottom
color:pos 5,py:mes tx.cnt
py += fontsize+margin
loop
pos 5,py:mes "etc..."
oncmd gosub *oncmd_wm_setcursor , $00000020 /*WM_SETCURSOR*/
stop
*oncmd_wm_setcursor
#define hincursorwnd wparam // cursorが有るウィンドウのハンドル。
nHitTest = lParam & 0xFFFF; // カーソルの位置
/* Windowの標準領域との判定を行う場合 */
if(nHitTest==HTCAPTION){
cursor $00007F8A /*IDC_APPSTARTING*/
}else:if(nhittest==HTREDUCE) or (nhittest==HTCLOSE) or (nHitTest==HTMAXBUTTON){
cursor $00007F89 /*IDC_HAND*/
}else{
/* ユーザーが定義した領域を使用する場合 */
py=5
foreach tx
is_set = (mousex>left) and (mousey>top) and (mousex<right) and (mousey<bottom)
if(is_set):cursor id.cnt:break
py += fontsize+margin
loop
if(is_set==0):cursor $00007F00 /*IDC_ARROW*/
}
return 0
#deffunc cursor int id_
LoadCursor 0,id_
SetCursor stat
return
| |
|
2012/10/11(Thu) 21:48:42|NO.49923
こう、こんな感じのがやりたいんですよ
ただどうヂオンさんのマウスカーソル変更が複雑でどう組み込めばいいのかがわかりません・・・
#define boxwidth 1;ポインタ当たり判定の大きさ(中心から外までの長さ 1の時は3*3)
bx=10
by=10
bw=100
bh=120
lmx=0 : lmy=0;ドラッグ時にマウス位置記憶用
point=0;クリック中ポイント 1 5 2
; 6 7
; 3 8 4
*main
getkey key
if key : click++ : else : click=0
title str(point)
lbx=bx : lby=by
switch point
case 1
bx+=mousex-lmx : by+=mousey-lmy
bw-=mousex-lmx : bh-=mousey-lmy
lmx=mousex : lmy=mousey
swbreak
case 2
by+=mousey-lmy
bw+=mousex-lmx : bh-=mousey-lmy
lmx=mousex : lmy=mousey
swbreak
case 3
bx+=mousex-lmx
bw-=mousex-lmx : bh+=mousey-lmy
lmx=mousex : lmy=mousey
swbreak
case 4
bw+=mousex-lmx : bh+=mousey-lmy
lmx=mousex : lmy=mousey
swbreak
case 5
by+=mousey-lmy
bh-=mousey-lmy
lmx=mousex : lmy=mousey
swbreak
case 6
bx+=mousex-lmx
bw-=mousex-lmx
lmx=mousex : lmy=mousey
swbreak
case 7
bw+=mousex-lmx
lmx=mousex : lmy=mousey
swbreak
case 8
bh+=mousey-lmy
lmx=mousex : lmy=mousey
swbreak
swend
if bw<8{bw=8 : bx=lbx}
if bh<8{bh=8 : by=lby}
if click=0 : point=0
color 0,0,0
pos bx+bw,by
line bx,by
line bx,by+bh
line bx+bw,by+bh
line bx+bw,by
boxf bx-boxwidth,by-boxwidth,bx+boxwidth,by+boxwidth
boxf bx-boxwidth,by+bh-boxwidth,bx+boxwidth,by+bh+boxwidth
boxf bx+bw-boxwidth,by+bh-boxwidth,bx+bw+boxwidth,by+bh+boxwidth
boxf bx+bw-boxwidth,by-boxwidth,bx+bw+boxwidth,by+boxwidth
boxf bx+bw/2-boxwidth,by-boxwidth,bx+bw/2+boxwidth,by+boxwidth
boxf bx-boxwidth,by+bh/2-boxwidth,bx+boxwidth,by+bh/2+boxwidth
boxf bx+bw-boxwidth,by+bh/2-boxwidth,bx+bw+boxwidth,by+bh/2+boxwidth
boxf bx+bw/2-boxwidth,by+bh-boxwidth,bx+bw/2+boxwidth,by+bh+boxwidth
if click=1 & point=0 {
if onpoint(bx,by) : point=1
if onpoint(bx+bw,by) : point=2
if onpoint(bx,by+bh) : point=3
if onpoint(bx+bw,by+bh) : point=4
if onpoint(bx+bw/2,by) : point=5
if onpoint(bx,by+bh/2) : point=6
if onpoint(bx+bw,by+bh/2) : point=7
if onpoint(bx+bw/2,by+bh) : point=8
}
redraw 1
await 15
redraw 0
color 255,255,255
boxf
goto *main
#defcfunc onpoint int _p1,int _p2;マウスがポインタに乗ってたら1を返しlmx,yにマウス座標を書く
if mousex>_p1+boxwidth | mousex<_p1-boxwidth | mousey>_p2+boxwidth | mousey<_p2-boxwidth : return 0
lmx=mousex : lmy=mousey
return 1
前の投稿を消して改良しました
| |
|
2012/10/11(Thu) 21:55:58|NO.49925
すいません
上の「lbx=bx : lby=by」〜「if bh<8{bh=8 : by=lby}」
を下記のものに置き換えて下さい(無駄修正と高速で幅を最小にした時に少し移動してしまうのを修正です)
lbx=bx : lby=by
switch point
case 1
bx+=mousex-lmx : by+=mousey-lmy
bw-=mousex-lmx : bh-=mousey-lmy
swbreak
case 2
by+=mousey-lmy
bw+=mousex-lmx : bh-=mousey-lmy
swbreak
case 3
bx+=mousex-lmx
bw-=mousex-lmx : bh+=mousey-lmy
swbreak
case 4
bw+=mousex-lmx : bh+=mousey-lmy
swbreak
case 5
by+=mousey-lmy
bh-=mousey-lmy
swbreak
case 6
bx+=mousex-lmx
bw-=mousex-lmx
swbreak
case 7
bw+=mousex-lmx
swbreak
case 8
bh+=mousey-lmy
swbreak
swend
if bw<8{bx=lbx+bw-8+(mousex-lmx) : bw=8}
if bh<8{by=lby+bh-8+(mousey-lmy) : bh=8}
lmx=mousex : lmy=mousey
|
|
2012/10/12(Fri) 00:03:31|NO.49929
|
|
2012/10/12(Fri) 03:16:06|NO.49938
こんなかんじです。
基本的に、await の位置で、*oncmd_wm_setcursor の処理が実行されている形になります。
#include "user32.as"
// ポインタ当たり判定の大きさ(中心から外までの長さ 1の時は3*3)
#define boxwidth 1
// カーソルのID
#define IDC_ARROW $00007F00
#define IDC_SIZENWSE $00007F82
#define IDC_SIZENESW $00007F83
#define IDC_SIZEWE $00007F84
#define IDC_SIZENS $00007F85
bx=10
by=10
bw=100
bh=120
lmx=0 : lmy=0;ドラッグ時にマウス位置記憶用
point=0;クリック中ポイント 1 5 2
; 6 7
; 3 8 4
oncmd gosub *oncmd_wm_setcursor , $00000020 /*WM_SETCURSOR*/
*main
getkey key
if key : click++:else:click=0:point=0
title str(point)
lbx=bx : lby=by
if(key){
switch point
case 1
bx+=mousex-lmx : by+=mousey-lmy
bw-=mousex-lmx : bh-=mousey-lmy
swbreak
case 2
by+=mousey-lmy
bw+=mousex-lmx : bh-=mousey-lmy
swbreak
case 3
bx+=mousex-lmx
bw-=mousex-lmx : bh+=mousey-lmy
swbreak
case 4
bw+=mousex-lmx : bh+=mousey-lmy
swbreak
case 5
by+=mousey-lmy
bh-=mousey-lmy
swbreak
case 6
bx+=mousex-lmx
bw-=mousex-lmx
swbreak
case 7
bw+=mousex-lmx
swbreak
case 8
bh+=mousey-lmy
swbreak
swend
}
if bw<8{bx=lbx+bw-8+(mousex-lmx) : bw=8}
if bh<8{by=lby+bh-8+(mousey-lmy) : bh=8}
lmx=mousex : lmy=mousey
if point==0 {
if onpoint(bx,by) : point=1
if onpoint(bx+bw,by) : point=2
if onpoint(bx,by+bh) : point=3
if onpoint(bx+bw,by+bh) : point=4
if onpoint(bx+bw/2,by) : point=5
if onpoint(bx,by+bh/2) : point=6
if onpoint(bx+bw,by+bh/2) : point=7
if onpoint(bx+bw/2,by+bh) : point=8
}
color 0,0,0
pos bx+bw,by
line bx,by
line bx,by+bh
line bx+bw,by+bh
line bx+bw,by
boxf bx-boxwidth,by-boxwidth,bx+boxwidth,by+boxwidth
boxf bx-boxwidth,by+bh-boxwidth,bx+boxwidth,by+bh+boxwidth
boxf bx+bw-boxwidth,by+bh-boxwidth,bx+bw+boxwidth,by+bh+boxwidth
boxf bx+bw-boxwidth,by-boxwidth,bx+bw+boxwidth,by+boxwidth
boxf bx+bw/2-boxwidth,by-boxwidth,bx+bw/2+boxwidth,by+boxwidth
boxf bx-boxwidth,by+bh/2-boxwidth,bx+boxwidth,by+bh/2+boxwidth
boxf bx+bw-boxwidth,by+bh/2-boxwidth,bx+bw+boxwidth,by+bh/2+boxwidth
boxf bx+bw/2-boxwidth,by+bh-boxwidth,bx+bw/2+boxwidth,by+bh+boxwidth
redraw
await 30
redraw 0
color 255,255,255
boxf
goto *main
#defcfunc onpoint int _p1,int _p2;マウスがポインタに乗ってたら1を返しlmx,yにマウス座標を書く
if mousex>_p1+boxwidth | mousex<_p1-boxwidth | mousey>_p2+boxwidth | mousey<_p2-boxwidth : return 0
lmx=mousex : lmy=mousey
return 1
*oncmd_wm_setcursor
if(point==4) or (point==1){
cursor IDC_SIZENWSE
}else:if(point==2 or point==3){
cursor IDC_SIZENESW
}else:if(point==6 or point==7){
cursor IDC_SIZEWE
}else:if(point==5 or point==8){
cursor IDC_SIZENS
}else{
cursor IDC_ARROW
}
return 0
#deffunc cursor int id_
LoadCursor 0,id_
SetCursor stat
return
| |
|
2012/10/12(Fri) 17:52:58|NO.49946
ありがとうございます!
最終的にできたのがこれです
公開しておきます
#include "user32.as"
#define boxwidth 2;ポインタ当たり判定の大きさ(中心から外までの長さ 1の時は3*3)
// カーソルのID
#define IDC_ARROW $00007F00
#define IDC_SIZENWSE $00007F82
#define IDC_SIZENESW $00007F83
#define IDC_SIZEWE $00007F84
#define IDC_SIZENS $00007F85
#define IDC_SIZEALL $00007F86
bx=10
by=10
bw=100
bh=120
lmx=0 : lmy=0;ドラッグ時にマウス位置記憶用
point=0;クリック中ポイント 1 5 2
; 6 7
; 3 8 4
oncmd gosub *oncmd_wm_setcursor , $00000020 /*WM_SETCURSOR*/
*main
getkey key
if key : click++ : else : click=0
title str(point)
lbx=bx : lby=by
switch point
case 1
bx+=mousex-lmx : by+=mousey-lmy
bw-=mousex-lmx : bh-=mousey-lmy
if bw<8{bx=lbx+(bw-8+mousex-lmx) : bw=8}
if bh<8{by=lby+(bh-8+mousey-lmy) : bh=8}
swbreak
case 2
by+=mousey-lmy
bw+=mousex-lmx : bh-=mousey-lmy
if bw<8{bw=8}
if bh<8{by=lby+(bh-8+mousey-lmy) : bh=8}
swbreak
case 3
bx+=mousex-lmx
bw-=mousex-lmx : bh+=mousey-lmy
if bw<8{bx=lbx+(bw-8+mousex-lmx) : bw=8}
if bh<8{bh=8}
swbreak
case 4
bw+=mousex-lmx : bh+=mousey-lmy
if bw<8{bw=8}
if bh<8{bh=8}
swbreak
case 5
by+=mousey-lmy
bh-=mousey-lmy
if bh<8{by=lby+(bh-8+mousey-lmy) : bh=8}
swbreak
case 6
bx+=mousex-lmx
bw-=mousex-lmx
if bw<8{bx=lbx+(bw-8+mousex-lmx) : bw=8}
swbreak
case 7
bw+=mousex-lmx
if bw<8{bw=8}
swbreak
case 8
bh+=mousey-lmy
if bh<8{bh=8}
swbreak
case 9
bx+=mousex-lmx : by+=mousey-lmy
swbreak
swend
lmx=mousex : lmy=mousey
if click=0{point=0 : spoint=0}
color 0,0,0
pos bx+bw,by
line bx,by
line bx,by+bh
line bx+bw,by+bh
line bx+bw,by
drawbox2 bx,by,boxwidth,boxwidth
drawbox2 bx,by+bh,boxwidth,boxwidth
drawbox2 bx+bw,by+bh,boxwidth,boxwidth
drawbox2 bx+bw,by,boxwidth,boxwidth
drawbox2 bx+bw/2,by,boxwidth,boxwidth
drawbox2 bx,by+bh/2,boxwidth,boxwidth
drawbox2 bx+bw,by+bh/2,boxwidth,boxwidth
drawbox2 bx+bw/2,by+bh,boxwidth,boxwidth
if point=0 {
if mousex>=bx & mousex<=bx+bw & mousey>=by & mousey<=by+bh{pointset 9 : lmx=mousex : lmy=mousey}
if onpoint(bx,by) {pointset 1}
if onpoint(bx+bw,by) {pointset 2}
if onpoint(bx,by+bh) {pointset 3}
if onpoint(bx+bw,by+bh) {pointset 4}
if onpoint(bx+bw/2,by) {pointset 5}
if onpoint(bx,by+bh/2) {pointset 6}
if onpoint(bx+bw,by+bh/2) {pointset 7}
if onpoint(bx+bw/2,by+bh) {pointset 8}
}
redraw 1
await 15
redraw 0
color 255,255,255
boxf
goto *main
#deffunc pointset int _p1
spoint=_p1
if click=1 : point=_p1
return
#defcfunc onpoint int _p1,int _p2;マウスがポインタに乗ってたら1を返しlmx,yにマウス座標を書く
if mousex>_p1+boxwidth | mousex<_p1-boxwidth | mousey>_p2+boxwidth | mousey<_p2-boxwidth : return 0
lmx=mousex : lmy=mousey
return 1
#deffunc drawbox int _p1,int _p2,int _p3,int _p4
pos _p1+_p3,_p2
line _p1,_p2
line _p1,_p2+_p4
line _p1+_p3,_p2+_p4
line _p1+_p3,_p2
return
#deffunc drawbox2 int _p1,int _p2,int _p3,int _p4
boxf _p1-_p3,_p2-_p4,_p1+_p3,_p2+_p4
color 255,255,255
boxf _p1-_p3+1,_p2-_p4+1,_p1+_p3-1,_p2+_p4-1
color 0,0,0
return
*oncmd_wm_setcursor
if(spoint==4) or (spoint==1){
cursor IDC_SIZENWSE
}else:if(spoint==2 or spoint==3){
cursor IDC_SIZENESW
}else:if(spoint==6 or spoint==7){
cursor IDC_SIZEWE
}else:if(spoint==5 or spoint==8){
cursor IDC_SIZENS
}else:if(spoint==9){
cursor IDC_SIZEALL
}else{
cursor IDC_ARROW
}
return 0
#deffunc cursor int id_
LoadCursor 0,id_
SetCursor stat
return
| |
|