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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1026
ヒビノ氏可変ウィンドウのサイズ変更に会わせた描画位置の変更について5解決


ヒビノ氏

リンク

2013/10/26(Sat) 00:37:54|NO.57809

お世話になります。
このたび、自作プログラムで可変ウィンドウを利用しようと思いまして、
そこでウィンドウのサイズに合わせてウィンドウの中身が描画・表示される位置が
かわるスクリプトを組もうと思って試しに作ってみて以下のようなものができました。

常に黒い四角形がウィンドウの真ん中に表示されるスクリプトです

#include "user32.as" buffer 0, ginfo(20), ginfo(21) GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $40000 gsel 0,1 : width 640,480 hoseix=ginfo(10)-640 hoseiy=ginfo(11)-480 oncmd gosub *resize,0x5 repeat redraw 0 color 255,255,255 : boxf redraw 1 await loop stop *resize color 255,255,255 color 0,0,0 boxf (ginfo(10)-hoseix)/2-8,(ginfo(11)-hoseiy)/2-8,(ginfo(10)-hoseix)/2+8,(ginfo(11)-hoseiy)/2+8 return ただ、個人的に描画命令をすべてrepeat~loop間におさめたいと思ったので、 ウィンドウサイズが変わった際はboxf描画位置を変数に代入するだけにとどめて 描画はrepeat~loopに任せようと以下のものに書き換えてみました。

#include "user32.as"

	buffer 0, ginfo(20), ginfo(21)

	GetWindowLong hwnd, -16
	SetWindowLong hwnd, -16, stat | $10000 | $40000
	
	gsel 0,1 : width 640,480

	hoseix=ginfo(10)-640
	hoseiy=ginfo(11)-480
	oncmd gosub *resize,0x5
	
	repeat
	redraw 0
	color 255,255,255 : boxf
	color 0,0,0 : boxf x,y,xx,yy
	redraw 1
	await
	loop

stop

*resize
x=(ginfo(10)-hoseix)/2-8
y=(ginfo(11)-hoseiy)/2-8
xx=(ginfo(10)-hoseix)/2+8
yy=(ginfo(11)-hoseiy)/2+8
return

これで組んだときに、ウィンドウサイズ変更の操作の最中は
常にサブルーチンに飛んでるために画面に変化がでないことは理解してますが、
サイズ変更するまえや、サイズ変更終了後の動作が期待してたものとは違ってしまいました。
特に最大化を繰り返すと、黒い四角形のあるべき位置が想定と真逆になってしまうといいますか、
最大化したときはウィンドウサイズが640x480のときの中央位置に表示されてて
640x480のときは最大時の中央に表示されているというあべこべなことになってしまいます。

これの原因と解決法などありましたらご教示ください。



この記事に返信する


ヒビノ氏

リンク

2013/10/26(Sat) 00:41:00|NO.57810

書き込みの表示がおかしくなってしまったのでスクリプト部分以下を書き直します、すみません


#include "user32.as" buffer 0, ginfo(20), ginfo(21) GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $40000 gsel 0,1 : width 640,480 hoseix=ginfo(10)-640 hoseiy=ginfo(11)-480 oncmd gosub *resize,0x5 repeat redraw 0 color 255,255,255 : boxf redraw 1 await loop stop *resize color 255,255,255 color 0,0,0 boxf (ginfo(10)-hoseix)/2-8,(ginfo(11)-hoseiy)/2-8,(ginfo(10)-hoseix)/2+8,(ginfo(11)-hoseiy)/2+8 return
ただ、個人的に描画命令をすべてrepeat~loop間におさめたいと思ったので、
ウィンドウサイズが変わった際はboxf描画位置を変数に代入するだけにとどめて
描画はrepeat~loopに任せようと以下のものに書き換えてみました。


#include "user32.as" buffer 0, ginfo(20), ginfo(21) GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $40000 gsel 0,1 : width 640,480 hoseix=ginfo(10)-640 hoseiy=ginfo(11)-480 oncmd gosub *resize,0x5 repeat redraw 0 color 255,255,255 : boxf color 0,0,0 : boxf x,y,xx,yy redraw 1 await loop stop *resize x=(ginfo(10)-hoseix)/2-8 y=(ginfo(11)-hoseiy)/2-8 xx=(ginfo(10)-hoseix)/2+8 yy=(ginfo(11)-hoseiy)/2+8 return

これで組んだときに、ウィンドウサイズ変更の操作の最中は

常にサブルーチンに飛んでるために画面に変化がでないことは理解してますが、

サイズ変更するまえや、サイズ変更終了後の動作が期待してたものとは違ってしまいました。

特に最大化を繰り返すと、黒い四角形のあるべき位置が想定と真逆になってしまうといいますか、

最大化したときはウィンドウサイズが640x480のときの中央位置に表示されてて

640x480のときは最大時の中央に表示されているというあべこべなことになってしまいます。



これの原因と解決法などありましたらご教示ください。



ht.

リンク

2013/10/26(Sat) 01:07:13|NO.57811

bufferをscreenにしてみてはいかがですか?



fortunehill

リンク

2013/10/26(Sat) 02:34:11|NO.57813

/*ご参考(初期表示の見栄えからbufferからscreenへの変更は無理がある様ですね:再描画しても変)*/

#include "user32.as" screen 0,ginfo(20),ginfo(21),,-ginfo_dispx GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $40000 ;SetWindowPos hwnd,0,0,0,0,0,$27 ; フォームの再描画 oncmd gosub *label,0x5 width 640,480,0,0 repeat await 20 redraw 0 color 255,255,255 :boxf color :boxf pp,pp(1),pp+100,pp(1)+100 redraw 1 loop stop *label pp = (lparam&$FFFF)-100>>1,(lparam>>16&$FFFF)-100>>1 ; 位置の取得と中心オフセット return



MillkeyStars

リンク

2013/10/26(Sat) 07:49:13|NO.57817

スクリプト大幅に変えちゃってるけど、これでいいのかな?


#include "user32.as" #const WM_SIZE 0x0005 //最初に最大化されたときに必要なウィンドウの大きさを作る。 //(最初から非表示として作ると、サイズ変更時に表示されないで済む) screen 1,ginfo_dispx,ginfo_dispy,2 : title "サイズ可変" : width 640,480 GetWindowLong hwnd, -16 SetWindowLong hwnd, -16, stat | $10000 | $40000 oncmd gosub *resize,WM_SIZE //ウィンドウを作成し、設定し終わったら表示させる。 gsel 1,1 //表示するボックスのサイズ box_size_x = 16 box_size_y = 16 //起動直後の表示 gosub *redraw_control repeat wait 1 if redraw_flag = 1 : gosub *redraw_control loop stop *redraw_control gsel 1 //ウィンドウのクライアント領域サイズ取得 hoceix = ginfo(12) //←主のは、ウィンドウサイズになってたので、 hoceiy = ginfo(13) //クライアントサイズに修正してある。 //ボックス位置情報計算 x= (hoceix / 2) - (box_size_x / 2) y= (hoceiy / 2) - (box_size_y / 2) xx= x + box_size_x yy= y + box_size_y //表示処理 redraw 0 color 255,255,255 : boxf : color 0,0,0 boxf x,y,xx,yy pos 0,0 : mes "Window Cli Width = "+hoceix pos 0,20 : mes "Window Cli Height = "+hoceiy pos 0,40 : mes "Box Left = "+x pos 0,60 : mes "Box Top = "+y pos 0,80 : mes "Box Right = "+xx+" / RightLength = "+(hoceix - xx) pos 0,100: mes "Box Bottom = "+yy+" / BottomLength = "+(hoceiy - yy) //中央ライン line hoceix/2,0,hoceix/2,hoceiy line 0,hoceiy/2,hoceix,hoceiy/2 redraw 1 //再描画フラグを 0 に戻す。 redraw_flag = 0 return *resize width ginfo(12),ginfo(13) //VRAM領域更新 redraw_flag = 1 return 0

サイズが変更されたら、HSPのVRAM領域のサイズも変更してあげよう。
そーしないと、640 * 480 固定の領域しか再描画してくれなくなる。

[スクリプトミスしてたので、一旦削除してスクリプト修正済み]



ヒビノ氏

リンク

2013/10/31(Thu) 00:27:44|NO.57910

fortunehillさん、MilkeyStarsさん

お二人のスクリプトを参考にさせていただきます、希望通りの動作ができたので助かりました
ありがとうございます!



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