|
|
|
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のときは最大時の中央に表示されているというあべこべなことになってしまいます。
これの原因と解決法などありましたらご教示ください。
| |
|
2013/10/26(Sat) 01:07:13|NO.57811
bufferをscreenにしてみてはいかがですか?
|
|
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
|
|
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さん
お二人のスクリプトを参考にさせていただきます、希望通りの動作ができたので助かりました
ありがとうございます!
|
|