|
|
2015/1/7(Wed) 21:59:22|NO.66916
非短形ウィンドウとはその通り、長方形でないウィンドウのことです。
実行ファイルを起動したとき、ロード画面になりますが、そのとき、
凝ったものだと普通の枠でなく角が取れたものや、
キャラクターの画像の部分だけ描画されています。
また、演出に利用されている時もあります。
↓いりす症候群!のこの部分。ネタバレ注意。
http://youtu.be/wT_s4qHESFQ?t=1m38s
つまりこういうものを作りたいんですが、HSPで作れますか?
作れるなら、作り方も教えてくださると有難いです。
お願いします。
|
|
2015/1/7(Wed) 22:20:58|NO.66918
レイヤードウィンドウを使えば簡単にできます
#uselib "user32.dll"
#func GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int,sptr,int,int
#define LWA_COLORKEY 0x00000001
#define LWA_ALPHA 0x00000002
screen 1
bgscr 0,500,300
hwnd0 = hwnd
color 127,127,127
circle 0,0,300,300
circle 200,0,500,300
GetWindowLong hwnd0,-20
SetWindowLong hwnd0,-20,stat|$80000
SetLayeredWindowAttributes hwnd0,0x00FFFFFF,255,LWA_ALPHA|LWA_COLORKEY ;白を透過させる
SetLayeredWindowAttributesの第二引数で透明にする色を指定します
また第三引数で透明度をしてします(0〜255 0が透明)
|
|
2015/1/8(Thu) 00:23:04|NO.66920
/*ご参考(リージョン)*/
#uselib "gdi32"
#func global CreateRoundRectRgn "CreateRoundRectRgn" sptr,sptr,sptr,sptr,sptr,sptr
#uselib "user32"
#func global SetWindowRgn "SetWindowRgn" sptr,sptr,sptr
screen 0,320,160 :boxf
CreateRoundRectRgn 0,0,320,160,50,50 :hReg = stat
SetWindowRgn hwnd,hReg,1
|
|
2015/1/10(Sat) 17:06:41|NO.66929
どちらの方も早い回答ありがとうございます。
非常に参考になりました。
本来ロード中に利用しようとしていたので、回答はできればで良いのですが、
kanahironさんのレイヤードウィンドウを移動させるには、
どの部分にどのような命令を書き込むとよいのかを教えていただけると幸いです。
|
|
2015/1/11(Sun) 01:16:05|NO.66931
/*ご参考(NO.66918に下記を追加すれば左クリックでドラッグが可能です)*/
oncmd gosub *label,$201 ;WM_LBUTTONDOWN,
stop
*label
sendmsg hwnd0,$0A1,2 ;WM_NCLBUTTONDOWN HTCAPTION
return
|
|
2015/1/12(Mon) 20:47:44|NO.66943
移動させるサンプル
#include "user32.as"
#define SWP_NOSIZE 0x0001
#define SWP_NOMOVE 0x0002
#define SWP_NOZORDER 0x0004
#define SWP_NOACTIVATE 0x0010
#define SWP_FRAMECHANGED 0x0020
screen 0,960,540,0,ginfo_dispx/2-960/2,ginfo_dispy/2-540/2
gsel 0,2
fs=(ginfo_sizex-ginfo_sx)/2 //枠の幅
ts=ginfo_sizey-ginfo_sy-fs //枠も含めたタイトルバーのサイズ
buffer 2
picload dir_exe+"\\hsptv\\jp6girl.bmp"
wsx=ginfo_winx
wsy=ginfo_winy
bgscr 1,wsx,wsy,2
gcopy 2,0,0,wsx,wsy
SetWindowPos hwnd, 0, -wsx, ginfo_dispy/2, 0,0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE //width だと画面外に配置できないのでSetWindowPosを使用
GetWindowLongA hwnd,-20 ;レイヤードウインドウ使用の手続き
SetWindowLongA hwnd,-20,stat | $80000
SetLayeredWindowAttributes hwnd,$0,0,1
SetWindowPos hwnd, 0, 0, 0, 0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED //ウィンドウ更新のために実行
//動かすウウィンドウの位置を保存
wpx=1.0*ginfo_wx1
wpy=1.0*ginfo_wy1
gsel 1,1
gsel 0,2
repeat
wpx+=sin(0.005*cnt)*3
wpy+=sin(0.05*cnt)
if (int(wpx) ! wpx_bak) or (int(wpy) ! wpy_bak) { //座標が変わった時だけ
wpx_bak=int(wpx)
wpy_bak=int(wpy)
gsel 1,0
//ウィンドウ移動
SetWindowPos hwnd, 0, int(wpx), int(wpy), 0,0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE
}
gsel 0,0
redraw 0
color 0,60,60
boxf
//動くウィンドウ内をメインウィンドウにコピー
pos wpx-ginfo_wx1-fs,wpy-ginfo_wy1-ts
gmode 2
gcopy 1,0,0,wsx,wsy
//黒縁
color
boxf 0,0,ginfo_sx,48
boxf 0,ginfo_sy-48,ginfo_sx,ginfo_sy
boxf 0,0,96,ginfo_sy
boxf ginfo_sx-96,0,ginfo_sx,ginfo_sy
redraw 1
await 32
loop
stop
ロード中に動かしたいなら
ロードと動くウィンドウを別ソフトにするとか工夫が必要
| |
|
2015/1/14(Wed) 20:22:21|NO.66951
みなさんご親切にありがとうございます。
特に暇人さんは、参考動画の再現までしでくださり、感激の限りです。
完全に解決しました。
|
|