|
|
2013/9/21(Sat) 18:05:08|NO.57281
この記事は投稿者により削除されました。
2013/11/19(Tue) 18:25:06
|
|
2013/9/21(Sat) 18:24:02|NO.57282
|
|
2013/9/22(Sun) 01:53:17|NO.57290
タイトルバーらしき画像を表示して
タイトルバーらしき場所でマウスがクリックされたら移動して
閉じるボタンらしき場所でマウスがクリックされたら閉じて
枠らしき場所でマウスがクリックされたらサイズ変更して
とかなんとか自分でやれば出来る。重いけど。
|
|
2013/9/22(Sun) 11:59:35|NO.57291
SetParentを使って一回の描画で済ませるようにモジュール化しました。
#module
#uselib "user32.dll"
#cfunc GetSystemMetrics "GetSystemMetrics" int
#func SetParent "SetParent" int,int
#func SetWindowRgn "SetWindowRgn" int,int,int
#uselib "gdi32.dll"
#func CreateRoundRectRgn "CreateRoundRectRgn" int,int,int,int,int,int
/*
draw_window : 指定したウィンドウIDのウィンドウ枠を自前の画像で描画します
p1...自前で枠を描画したいウィンドウID
p2...描画用の空きウィンドウ
p3...描画したい画像のバッファID
*/
#deffunc draw_window int _id1 , int _id2 , int bid
id1=_id1 : id2=_id2 : buf=bid ;変数を移す
//id1の情報
gsel id1 ;第一パラメータで指定したID
wx=ginfo(12) : wy=ginfo(13) : wpx=ginfo(4) :wpy=ginfo(5) ;ウィンドウ位置、高さ
frame_=GetSystemMetrics($00000007) : tit_=GetSystemMetrics($00000004) ;ウィンドウ枠、タイトルバー
hwnd0=hwnd ;ウィンドウハンドル
//id2の作成
bgscr id2 , wx + frame_*2 , wy + tit_ + frame_ , 4 , wpx , wpy ;ウィンドウ生成
CreateRoundRectRgn 0 , 0 , wx + frame_*2 , wy + tit_ + frame_ , frame_ , frame_
SetWindowRgn hwnd,stat,1
gcopy buf , 0 , 0 , wx + frame_*2 , wy + tit_ + frame_
hwnd1=hwnd ;ウィンドウハンドル
//設定
SetParent hwnd0 , hwnd1 ;親子化
//id1の整形
gsel id1
width , , frame_ , tit_
onclick gosub*Move
return 0
*Move
if ginfo(2)=id2:sendmsg hwnd1,$a1,2 //ウィンドウ移動
return
#global
buffer 2,1000,1000 ;画像のサイズはウィンドウサイズよりも大きめにする(縦横30くらい)
gradf 0,0,1000,1000,0,$555555,$FFFFFF ;ここにpicloadなど入れる
bgscr 0,640,480 ;タイトルを描画したいウィンドウはbgscr
color 55:boxf
draw_window 0 , 1 , 2 ;ウィンドウタイトル描画
//おまけ
*main
redraw 0
color rnd(100):boxf
wait 10
redraw 1
goto *main
| |
|
2013/9/22(Sun) 16:16:46|NO.57292
/*ご参考(改:過去ログ「ウィンドウの枠を完全に消したい」)*/
#uselib "user32.dll"
#func global GetFocus "GetFocus"
#func global ShowWindow "ShowWindow" sptr,sptr
#func global DrawFrameControl "DrawFrameControl" sptr,sptr,sptr,sptr
#func global DrawCaption "DrawCaption" sptr,sptr,sptr,sptr
:h0 = hwnd
bgscr 1,640,480+21 :h1 = hwnd
oncmd gosub *label_1,$201
repeat
redraw 0
Getfocus
if (stat == h1) {nn = 1 :color $AB,$C4,$DF} else {nn = 0 :color $D7,$E4,$F2}
line 638,499,638,0 :line 1,499 :line 1,1
line 639,500,639,0 :line 0,500 :line 0,0
ii = 1 ,1,640-1 ,21 :DrawCaption h0, hdc,varptr(ii),nn | $4 | $8 |$20
ii = 640-8-26 ,4,640-8 ,20 :DrawFrameControl hdc,varptr(ii),$1,$0
ii = 640-8-26-30,4,640-8-30,20 :DrawFrameControl hdc,varptr(ii),$1,$2 | $100
ii = 640-8-26-60,4,640-8-60,20 :DrawFrameControl hdc,varptr(ii),$1,$1
redraw 1
await 20
loop
stop
*label_1
pp = mousex,mousey
if (pp(1) >= 4) and (pp(1) <= 20) { if (pp >= 606) and (pp <= 632) {end}
else:if (pp >= 546) and (pp <= 572) {ShowWindow h1,2}
else {sendmsg h1,$A1,2}}
return
| |
|
2013/9/22(Sun) 21:51:16|NO.57294
catsさんが投稿したスクリプト
#module
#uselib "user32.dll"
#cfunc GetSystemMetrics "GetSystemMetrics" int
#func SetParent "SetParent" int,int
#func SetWindowRgn "SetWindowRgn" int,int,int
#uselib "gdi32.dll"
#func CreateRoundRectRgn "CreateRoundRectRgn" int,int,int,int,int,int
/*
draw_window : 指定したウィンドウIDのウィンドウ枠を自前の画像で描画します
p1...自前で枠を描画したいウィンドウID
p2...描画用の空きウィンドウ
p3...描画したい画像のバッファID
*/
#deffunc draw_window int _id1 , int _id2 , int bid
id1=_id1 : id2=_id2 : buf=bid ;変数を移す
//id1の情報
gsel id1 ;第一パラメータで指定したID
wx=ginfo(12) : wy=ginfo(13) : wpx=ginfo(4) :wpy=ginfo(5) ;ウィンドウ位置、高さ
frame_=GetSystemMetrics($00000007) : tit_=GetSystemMetrics($00000004) ;ウィンドウ枠、タイトルバー
hwnd0=hwnd ;ウィンドウハンドル
//id2の作成
bgscr id2 , wx + frame_*2 , wy + tit_ + frame_ , 4 , wpx , wpy ;ウィンドウ生成
CreateRoundRectRgn 0 , 0 , wx + frame_*2 , wy + tit_ + frame_ , frame_ , frame_
SetWindowRgn hwnd,stat,1
gcopy buf , 0 , 0 , wx + frame_*2 , wy + tit_ + frame_
hwnd1=hwnd ;ウィンドウハンドル
//設定
SetParent hwnd0 , hwnd1 ;親子化
//id1の整形
gsel id1
width , , frame_ , tit_
onclick gosub*Move
return 0
*Move
if ginfo(2)=id2:sendmsg hwnd1,$a1,2 //ウィンドウ移動
return
#global
buffer 2,1000,1000 ;画像のサイズはウィンドウサイズよりも大きめにする(縦横30くらい)
gradf 0,0,1000,1000,0,$555555,$FFFFFF ;ここにpicloadなど入れる
bgscr 0,640,480 ;タイトルを描画したいウィンドウはbgscr
color 55:boxf
draw_window 0 , 1 , 2 ;ウィンドウタイトル描画
//おまけ
*main
redraw 0
color rnd(100):boxf
wait 10
redraw 1
goto *main
fortunehillさんが投稿したスクリプト
#uselib "user32.dll"
#func global GetFocus "GetFocus"
#func global ShowWindow "ShowWindow" sptr,sptr
#func global DrawFrameControl "DrawFrameControl" sptr,sptr,sptr,sptr
#func global DrawCaption "DrawCaption" sptr,sptr,sptr,sptr
:h0 = hwnd
bgscr 1,640,480+21 :h1 = hwnd
oncmd gosub *label_1,$201
repeat
redraw 0
Getfocus
if (stat == h1) {nn = 1 :color $AB,$C4,$DF} else {nn = 0 :color $D7,$E4,$F2}
line 638,499,638,0 :line 1,499 :line 1,1
line 639,500,639,0 :line 0,500 :line 0,0
ii = 1 ,1,640-1 ,21 :DrawCaption h0, hdc,varptr(ii),nn | $4 | $8 |$20
ii = 640-8-26 ,4,640-8 ,20 :DrawFrameControl hdc,varptr(ii),$1,$0
ii = 640-8-26-30,4,640-8-30,20 :DrawFrameControl hdc,varptr(ii),$1,$2 | $100
ii = 640-8-26-60,4,640-8-60,20 :DrawFrameControl hdc,varptr(ii),$1,$1
redraw 1
await 20
loop
stop
*label_1
pp = mousex,mousey
if (pp(1) >= 4) and (pp(1) <= 20) { if (pp >= 606) and (pp <= 632) {end}
else:if (pp >= 546) and (pp <= 572) {ShowWindow h1,2}
else {sendmsg h1,$A1,2}}
return
この二つのスクリプトにタイトルバーの名前を変えるスクリプトを教えてください。
普通のタイトルバーには「title "XXX"」のスクリプトを使うんですが…。
| |
|
2013/9/22(Sun) 22:30:58|NO.57295
catsさんのスクリプトはコメントが豊富ですので、今後さらにご自分で改造していくためにも、自分で詳しく読み解いて理解することをお勧めします。
catsさんのスクリプトの場合、bgscrで全体のウィンドウ(ID1)を作り、それの子ウィンドウとしてbgscrで作ったウィンドウ(ID0)に貼り付けています。ですから、タイトルバーに該当する部分はID1のウィンドウに書かれています。これはdraw_window命令を読むとわかることです。
ですから、タイトルバーを変えるには、ID1のbgscrに自分で文字を描画すればいいことがわかります。
fortunehillさんのスクリプトは、実際にタイトルバーを描画している部分は17〜20行目で、その中でもタイトルの文字列を描画しているのはDrawCaptionであることが調べればわかります。ですから、title命令を使えばちゃんとそれに合わせて変化してくれます(ループを回して描画を更新しているので)。
ただし、DrawCaptionの第一引数にh0(ID0のウィンドウのhwnd)を渡しているので、使用されるのはID0のウィンドウのタイトルです。ですから、title命令を使う場合はgselでID0に戻してから行う必要があります。
|
|
2013/9/23(Mon) 10:25:49|NO.57300
bgscr 0,320,240:cls 1
color 0,0,255
boxf 0,0,320,20
color 200,0,0
boxf 300,0,320,20
pos 302,0
color 255,255,255
mes"×"
pos 0,0
mes"自作ウィンドウ"
onclick gosub *move
*meinn
wait 2:color 200,0,0:boxf 300,0,320,20:color 255,255,255:pos 302,0:mes"×"
if mousey>20: goto *meinn
if mousex>=300 : color 255,0,0:boxf 300,0,320,20:pos 302,0:color 255,255,255:mes"×"
goto *meinn
*move
if mousey>20: return
if mousex>=300 : end
if wparam=1 : sendmsg hwnd,$00A1,2,0
return
*owari
end
この方法でもできるけど×を通り上や右にマウスが行くと×が光りっぱなし。
まぁ参考にしてください。
|
|
2013/9/23(Mon) 18:25:00|NO.57309
色々なアドバイスとスクリプトを提供してくださった皆さん、
ありがとうございました。
|
|