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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0921
ゴメ吉 (投稿者削除)8解決


ゴメ吉

リンク

2013/9/21(Sat) 18:05:08|NO.57281

この記事は投稿者により削除されました。
2013/11/19(Tue) 18:25:06



この記事に返信する


test

リンク

2013/9/21(Sat) 18:24:02|NO.57282

bgscrを用いてタイトルバーの無いウィンドウを作り、自分でオリジナルのタイトルバーを描画するのがいいと思います。

http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200512/05120002.txt
などが参考になります。



きのよー

リンク

2013/9/22(Sun) 01:53:17|NO.57290

タイトルバーらしき画像を表示して
タイトルバーらしき場所でマウスがクリックされたら移動して
閉じるボタンらしき場所でマウスがクリックされたら閉じて
枠らしき場所でマウスがクリックされたらサイズ変更して

とかなんとか自分でやれば出来る。重いけど。



cats

リンク

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



fortunehill

リンク

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"」のスクリプトを使うんですが…。



test

リンク

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に戻してから行う必要があります。



E.T

リンク

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

色々なアドバイスとスクリプトを提供してくださった皆さん、
ありがとうございました。



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