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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1125
seasaltgrollだとbuttonはスクロールしないのですが4解決


seasalt

リンク

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等で移動させる事は可能です。



FunnyMaker

リンク

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



seasalt

リンク

2013/11/25(Mon) 22:49:58|NO.58470

あり さん、FunnyMaker さん、回答ありがとうございます。

Win32API は使い慣れていないもので、試行錯誤してみましたが、上手くまとめることができませんでした。
もうすこし勉強が必要なようです…
FunnyMaker さんの方法でやってみたところ、こちらはシンプルにねらい通りの動作ができたので、
今回は FunnyMaker さんの方法で行ってみたいと思います。

お二人とも、ありがとうございましたm(_ _)m



fortunehill

リンク

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



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