HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1010
@keyペイントの選択のGUI7解決


@key

リンク

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



@key

リンク

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

前の投稿を消して改良しました



@key

リンク

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

ちょうど似たような物を作っていたので公開しておきマッシュ。
https://sites.google.com/site/decoysoft/download/files/FormObject.zip



ヂオン

リンク

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



@key

リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.