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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0107
ぬるぽhspで非短形ウィンドウは作れますか?6解決


ぬるぽ

リンク

2015/1/7(Wed) 21:59:22|NO.66916

非短形ウィンドウとはその通り、長方形でないウィンドウのことです。
実行ファイルを起動したとき、ロード画面になりますが、そのとき、
凝ったものだと普通の枠でなく角が取れたものや、
キャラクターの画像の部分だけ描画されています。
また、演出に利用されている時もあります。

↓いりす症候群!のこの部分。ネタバレ注意。
http://youtu.be/wT_s4qHESFQ?t=1m38s
つまりこういうものを作りたいんですが、HSPで作れますか?
作れるなら、作り方も教えてくださると有難いです。
お願いします。



この記事に返信する


kanahiron

リンク

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が透明)



fortunehill

リンク

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さんのレイヤードウィンドウを移動させるには、
どの部分にどのような命令を書き込むとよいのかを教えていただけると幸いです。



fortunehill

リンク

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

みなさんご親切にありがとうございます。
特に暇人さんは、参考動画の再現までしでくださり、感激の限りです。
完全に解決しました。



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