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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0708
ぱお子ウィンドウにウィンドウリージョンを使い動かすと描写がおかしくなります3解決


ぱお

リンク

2020/7/8(Wed) 15:12:16|NO.90939

bgscrで作成した子ウィンドウでリージョンで角丸にし、widthを使用してアニメーション
を作成したのですがたまにアニメーションの途中でリージョンがうまく適用されていないのか
角丸にならず、そのうえ角丸にしたことによって非表示になった部分がその場で描画されたまま
残ってしまいます。どうすればこの症状を解決できるのかわかりません...

説明が難しいのですが、以下がそのソースです。
これは使用上解決不可能な問題なのでしょうか...それとも解決できるのでしょうか。
解決方法があれば教えていただきたいです。

↓以下ソース

#uselib "user32" #func SetWindowRgn "SetWindowRgn" int, int, int #uselib "user32" #func SetParent "SetParent" int, int ParentHwnd = hwnd bgscr 1, 300,200, 8, 10,10 SetParent hwnd, ParentHwnd cls 2 ; 四角形の左上XYと右下XYの座標、 ; p5とp6は角の丸み楕円部分の高さと幅です。 hRegion = CreateRoundRectRgn (0, 0, 300, 200, 50, 50) SetWindowRgn hwnd, hRegion, 1 repeat i=0 repeat 50 setease 0,250,ease_quartic_out Big_Window_X = getease(i,50) flag=0 redraw 0 width ,,Big_Window_X,20 i=i+1 redraw 1 wait 1 loop i=0 repeat 50 setease 250,0,ease_quartic_out Big_Window_X = getease(i,50) flag=0 redraw 0 width ,,Big_Window_X,20 i=i+1 redraw 1 wait 1 loop loop



この記事に返信する


あらや

リンク

2020/7/8(Wed) 16:25:00|NO.90940

>たまにアニメーションの途中でリージョンがうまく適用されていないのか角丸にならず
ウィンドウの描画をダブルバッファ化すれば
ちらつきを軽減することが出来ます。

>そのうえ角丸にしたことによって非表示になった部分がその場で描画されたまま残ってしまいます。
これは親ウインドウを塗り潰せば残りません。

CreateRoundRectRgn関数の定義など
抜けていた箇所を追加して修正してみました。


#uselib "user32" #func SetWindowRgn "SetWindowRgn" int, int, int #func SetParent "SetParent" int, int #func GetWindowLong "GetWindowLongA" int, int // 追加 #func SetWindowLong "SetWindowLongA" int, int, int // 追加 #uselib "gdi32.dll" // 追加 #func CreateRoundRectRgn "CreateRoundRectRgn" int, int, int, int, int, int // 追加 ParentHwnd = hwnd bgscr 1, 300,200, 8, 10,10 SetParent hwnd, ParentHwnd // 子ウィンドウをクリックすると親ウインドウがグレーアウトしてしまうのでスタイルを変更する style = GetWindowLong(hWnd, -16); // ウィンドウスタイルを取得 SetWindowLong hWnd, -16, style & 0x7FFFFFFF | 0x40000000; // ウィンドウスタイルからWS_POPUPを除外してWS_CHILDを付ける // 子ウィンドウの描画をダブルバッファ化してちらつきを抑える exstyle = GetWindowLong(hWnd, -20); // 拡張ウィンドウスタイルを取得 SetWindowLong hWnd, -20, exstyle | 0x02000000; // 拡張ウィンドウスタイルにWS_EX_COMPOSITEDを付ける cls 2 ; 四角形の左上XYと右下XYの座標、 ; p5とp6は角の丸み楕円部分の高さと幅です。 hRegion = CreateRoundRectRgn(0, 0, 300, 200, 50, 50) SetWindowRgn hwnd, hRegion, 1 repeat i=0 repeat 50 setease 0,250,ease_quartic_out Big_Window_X = getease(i,50) flag=0 redraw 0 gsel 0: redraw 0: color 255, 255, 255: boxf: redraw 1: gsel 1; // 親ウィンドウを白で塗りつぶし width ,,Big_Window_X,20 i=i+1 redraw 1 wait 1 loop i=0 repeat 50 setease 250,0,ease_quartic_out Big_Window_X = getease(i,50) flag=0 redraw 0 gsel 0: redraw 0: color 255, 255, 255: boxf: redraw 1: gsel 1; // 親ウィンドウを白で塗りつぶし width ,,Big_Window_X,20 i=i+1 redraw 1 wait 1 loop loop

完璧に角を消せるかどうかは微妙ですが、
このような形ではどうでしょうか。



ぱお

リンク

2020/7/8(Wed) 18:11:51|NO.90942

ありがとうございます!!



hsp

リンク

2020/7/8(Wed) 20:09:51|NO.90943

あらやさんの超人的スキルで解決



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