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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0117
こいるウィンドウを開く時のアニメーション5解決


こいる

リンク

2020/1/17(Fri) 23:28:48|NO.89266


screen 0,500,200 title "ボタン押して" pos ginfo_winx/2-50,ginfo_winy/2-13 objsize 100,25 button gosub"開く",*open onexit gosub*exit stop *open screen 1,260,80,0 title "ウィンドウ" return *exit if wparam==0:end gsel wparam,-1 return

こんな感じで、2つ目のウィンドウを開いたり、
閉じたりすることができるスクリプトを作ってみたのですが、

一回目の開くときは、開くアニメーションが付いたですが、
2回目以降はアニメーションが付きません。

どうすれば開くアニメーションが付くのでしょうか?



この記事に返信する


あらや

リンク

2020/1/18(Sat) 00:20:23|NO.89267

出来なくは無いのですが、実行すると何らかの不具合が起きる可能性があります。


まず単純にgselに-1で非表示ウィンドウにするのではなく、
完全に2つ目のウィンドウだけを破棄する必要があります。

APIのDestroyWindowを利用すれば破棄は可能ですが、
これだけだとHSP内部のウィンドウ情報等が残ってしまう上に
再度同じIDでウィンドウを作成出来なくなってしまいます。

よって、閉じる時には毎回DestroyWindowで破棄し
ginfo_newidで新規IDでウィンドウ作成のような
力技で解決することになります。

上記の理由から何らかの不具合が起きる可能性があるのでおススメはしませんが
それでもという場合は自己責任でやってみてください。



あらや

リンク

2020/1/18(Sat) 00:40:10|NO.89268

すみません、一部訂正します。

毎回ginfo_newidで新規IDでウィンドウ作成なら
DestroyWindowで破棄する必要は無かったですね……
ウィンドウを非表示にするだけで充分でした。

場合によっては大量のウィンドウを作ることになるのでやはりおススメは出来ませんが
この方法なら不具合は起こらないと思います。



ソラ

リンク

2020/1/18(Sat) 02:13:01|NO.89269

ちょっと強引ですがこんな方法もどうでしょうか?
SetLayeredでフェードイン、フェードアウトを再現しています。

;使うものを色々と登録 #uselib "user32.dll" #func GetWindowLongA "GetWindowLongA" int , int #func SetWindowLongA "SetWindowLongA" int , int , int #func SetLayered "SetLayeredWindowAttributes" int , int , int , int ;ウィンドウは非表示で作成 screen 1,260,80,2:hwnd_1=hwnd;ウィンドウハンドルを記録 ;スタイルの追加 GetWindowLongA hwnd_1 , -20 SetWindowLongA hwnd_1 , -20 , stat | 0x00080000 screen 0,500,200 title "ボタン押して" pos ginfo_winx/2-50,ginfo_winy/2-13 objsize 100,25 button gosub"開く",*open onexit gosub*exit stop *open ;初回だけWindowsのアニメーションがあるのでそれを使う if Flag=0:gsel 1,1:SetLayered hwnd_1 , 0 ,255, 2:Flag=1:return ;2回目以降は自作アニメーション gsel 1,2 AnimeFrame=15;フレーム数、60fps単位 setease 0,255,ease_quartic_inout;イージングでいい感じに! repeat AnimeFrame Alpha=getease(cnt,AnimeFrame) SetLayered hwnd_1, 0 ,Alpha, 2 await 16+(cnt\3!0);60fpsで維持する loop return *exit if wparam==0:end if wparam=1:{ AnimeFrame=15;フレーム数、60fps単位 setease 0,255,ease_quartic_inout;イージングでいい感じに! repeat AnimeFrame Alpha=getease(AnimeFrame-cnt,AnimeFrame) SetLayered hwnd_1, 0 ,Alpha, 2 await 16+(cnt\3!0);60fpsで維持する loop gsel 1,-1 } return



ooo

リンク

2020/1/18(Sat) 04:21:39|NO.89270

AnimateWindowというAPIを使うと近いことができます。

#include "user32.as" #include "gdi32.as" #define WM_PRINTCLIENT $00000318 #define SRCCOPY $00CC0020 #define AW_ACTIVATE $00020000 #define AW_BLEND $00080000 screen 0,500,200 title "ボタン押して" pos ginfo_winx/2-50,ginfo_winy/2-13 objsize 100,25 button gosub"開く",*open screen 1,260,80,2 onexit gosub*exit oncmd gosub *OnPRINTCLIENT,WM_PRINTCLIENT stop *open gsel 1,-1 AnimateWindow hwnd,200,AW_BLEND|AW_ACTIVATE title "ウィンドウ" return *exit if wparam==0:end gsel wparam,-1 return *OnPRINTCLIENT if ginfo_intid=1{ bitblt wparam,0,0,ginfo_sx,ginfo_sy,hdc,0,0,SRCCOPY } return 0



こいる

リンク

2020/1/18(Sat) 15:53:22|NO.89277

あらやさん、ソラさん、oooさん、返信ありがとうございます。
いろいろと難しそうだったので、おとなしく今まで通り標準命令を使おうと思います。

皆さんありがとうございました。



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