|
|
2013/11/25(Mon) 18:58:02|NO.58463
お世話になります。
タイトルどおりなのですが、grollだと、配置したオブジェクトはスクロールできないようです。
ボタンなどのオブジェクトも含めてスクロールさせたいのですが、どなたか方法を教えて頂けないでしょうか…?
ボタンがスクロールできないサンプル
screen 0,1200,600,0,,,480,360
repeat 6
y=cnt*100:i=cnt
repeat 12
x=cnt*100
if i&1 : color 255,0,0 : else : color 0,0,255
boxf x,y,x+100,y+100
i++
loop
loop
repeat 10
pos rnd(50)*10,rnd(50)*10
button gosub "test",*test
loop
color 255,255,255
font msgothic,120
pos 20,320: mes "ボタンは動きません。"
*main
stick key,$300
if key&$100 {
x=ginfo_vx : y=ginfo_vy
mx = ginfo_mx : my = ginfo_my
goto *main2
}
await 15
goto *main
*main2
stick key,$300
if (key&$100)=0 : goto *main
groll x+(mx-ginfo_mx),y+(my-ginfo_my)
await 15
goto *main2
*test
return
|
|
2013/11/25(Mon) 20:47:07|NO.58465
ボタン等のオブジェクトは子ウィンドウ扱いなので
HSPのグラフィックと同じ方法では移動できません。
各ボタンの座標とサイズを配列に記憶しておき
objinfoでボタン(ウィンドウオブジェクト)のハンドルを取得して
Win32API関数のMoveWindowやSetWindowPos等で移動させる事は可能です。
|
|
2013/11/25(Mon) 21:10:45|NO.58466
ウィンドウを2枚使って、一方を額縁、他方を絵画にしてスクロールする方法もあります。
(つまり、bgscrで作成した「絵画」ウィンドウを「額縁」ウィンドウの子ウィンドウにする。)
一回オブジェクトを描画したら絵画全体を動かすだけでいいので、楽です。
サンプルです。
#uselib "user32.dll"
#func SetParent "SetParent" int,int
#func SetWindowPos "SetWindowPos" int,int ,int,int ,int,int ,int
#define SWP_NOOWNERZORDER 0x0200
*LAB1
;< 額縁役のウィンドウ >
width_frame(0) = 600,400
screen 0,width_frame(0),width_frame(1),2
HWND_frame = hwnd
;< 絵画役のウィンドウ >
width_painting(0) = width_frame(0)*3/2 ,width_frame(1)*3/2
bgscr 1,width_painting(0),width_painting(1),2
HWND_painting = hwnd
;< 絵画を描く >
picload dir_tv + "bg05.jpg",1
objmode 2,1
objsize 100,50
font msgothic,90,16+1
color 255,0,0 : pos 0,0 : mes "スクロールできます"
font msgothic,30,16
num_btn_x = 5 : num_btn_y = 5
Δx = width_painting(0)/num_btn_x
Δy = width_painting(1)/num_btn_y
repeat num_btn_y
cnt1 = cnt
repeat num_btn_x
pos Δx*cnt,Δy*cnt1 : button gosub "BTN"+str(num_btn_x*cnt1+cnt)+"",*LAB4
loop
loop
;< 絵を額縁に入れる >
SetParent HWND_painting,HWND_frame
;< お披露目 >
gsel 1,1
gsel 0,1
*LAB2
pos_painting(0) = 0,0 ;絵の、額縁に対する位置
;< クリック監視 >
onclick gosub *LAB3
stop
*LAB3
;< スクロール >
pos_mouse_org(0) = ginfo_mx,ginfo_my ;マウスの最初の位置
pos_painting_org(0) = pos_painting(0),pos_painting(1) ;絵の最初の位置
gsel 1,0
repeat
pos_painting_previous(0) = pos_painting(0),pos_painting(1)
pos_painting(0) = limit(pos_painting_org(0) + ginfo_mx-pos_mouse_org(0),-width_painting(0)+1,width_frame(0)-1) ,limit(pos_painting_org(1) + ginfo_my-pos_mouse_org(1),-width_painting(1)+1,width_frame(1)-1)
if (pos_painting(0) ! pos_painting_previous(0))|(pos_painting(1) ! pos_painting_previous(1)) {;マウスの位置が変化したときだけ...
;width , ,pos_painting(0),pos_painting(1)
SetWindowPos HWND_painting,0 ,pos_painting(0),pos_painting(1) ,width_painting(0),width_painting(1) ,SWP_NOOWNERZORDER
}
getkey key,1 : if key = 0 : break ;マウスの左ボタンを離すまで待つ
await 50
loop
return
*LAB4
dialog "BTN "+stat+" was clicked!"
return

| |
|
2013/11/25(Mon) 22:49:58|NO.58470
あり さん、FunnyMaker さん、回答ありがとうございます。
Win32API は使い慣れていないもので、試行錯誤してみましたが、上手くまとめることができませんでした。
もうすこし勉強が必要なようです…
FunnyMaker さんの方法でやってみたところ、こちらはシンプルにねらい通りの動作ができたので、
今回は FunnyMaker さんの方法で行ってみたいと思います。
お二人とも、ありがとうございましたm(_ _)m
|
|
2013/11/26(Tue) 00:52:55|NO.58473
/*ご参考*/
#include "user32.as"
buffer 0
screen 1,640*2,480*2,,,,640,480
pos 200,10 :combox xx,,"\n\n\n"
pos 250,50 :listbox xx,,"\n\n\n"
wait 100 :Oroll 100, 20
wait 100 :Oroll -100,-20
stop
#deffunc Oroll int p1,int p2,local ii,local jj,local nn
:nn = 0,ginfo_vx,ginfo_vy :groll p1,p2
repeat
FindWindowExA hwnd,nn,0,0 :nn = stat
if (nn == 0) {break} :jj = 0,0,0,0
GetWindowRect nn,varptr(jj)
ScreenToClient hwnd,varptr(jj) :ii = (jj+nn(1)-ginfo_vx),(jj(1)+nn(2)-ginfo_vy)
SetWindowPos nn,0,ii,ii(1),0,0,$115
loop
return
|
|