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

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



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.90939への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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