C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: Opacityプロパティのちらつき防止について


(過去ログ 34 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■17143 / inTopicNo.1)  Opacityプロパティのちらつき防止について
  
□投稿者/ 小春 (4回)-(2008/04/17(Thu) 19:35:47)

分類:[VB.NET/VB2005] 

お世話になっております。

ちらつきに困ってます。

フォームにペタペタテキストや、ボタン、DataGridViewを数個貼り付け、
Me.Opacity = 0.8
とすると、画面が一瞬非表示?みたいな感じでちらっとします。
さらに、貼り付けたテキストやボタンが一瞬黒くなります。
これを回避する方法はないでしょうか?

ご教示の程、宜しくお願い致します。

引用返信 編集キー/
■17144 / inTopicNo.2)  Re[1]: Opacityプロパティのちらつき防止について
□投稿者/ Hirotow (185回)-(2008/04/17(Thu) 19:44:26)
ペタペタテキストが何なのかすごく気になりますがそれはさておき、これは仕様です。
フォーム全体を普通の描画よりも時間がかかる半透明で書き直すわけですから当然時間がかかり、これがちらつきとなって現れます。
対策としては、表示前にOpacityを設定しておくとか、DoubleBufferedプロパティをTrueにするとかすればいいと思います。
引用返信 編集キー/
■17145 / inTopicNo.3)  Re[2]: Opacityプロパティのちらつき防止について
□投稿者/ 小春 (5回)-(2008/04/17(Thu) 19:56:24)
No17144 (Hirotow さん) に返信
> ペタペタテキストが何なのかすごく気になりますがそれはさておき、これは仕様です。
> フォーム全体を普通の描画よりも時間がかかる半透明で書き直すわけですから当然時間がかかり、これがちらつきとなって現れます。
> 対策としては、表示前にOpacityを設定しておくとか、DoubleBufferedプロパティをTrueにするとかすればいいと思います。

早速のご返答ありがとうございます。
「ペタペタテキスト」→「ペタペタとテキスト」の間違いでした・・・。

DoubleBufferedプロパティをTrueにしても回避できませんでした。
それらしい、SuspendLayoutメソッド、ResumeLayoutメソッドでも試しましたが、無理でした。
これが仕様であれば、使い道がない気がします・・・。
引用返信 編集キー/
■17163 / inTopicNo.4)  Re[3]: Opacityプロパティのちらつき防止について
□投稿者/ れい (486回)-(2008/04/18(Fri) 00:39:17)
No17144 (Hirotow さん) に返信
> 対策としては、表示前にOpacityを設定しておくとか、DoubleBufferedプロパティをTrueにするとかすればいいと思います。

DoubleBufferedは子まで影響してくれません。
設定されたコントロールそのものの描画しか影響しません。
ですので、DoubleBufferedを設定する対策は意味ありません。

No17143 (小春 さん) に返信
> さらに、貼り付けたテキストやボタンが一瞬黒くなります。

いつ黒くなりますか?
動かすたびになりますか?
最初に表示させたときだけですか?
最小化してまた大きくしたときはどうですか?

No17145 (小春 さん) に返信
> これが仕様であれば、使い道がない気がします・・・。

多少ならきになりませんので、
程度によるでしょう。

いままでそれほど困ったことはないです。
引用返信 編集キー/
■17217 / inTopicNo.5)  Re[4]: Opacityプロパティのちらつき防止について
□投稿者/ 小春 (6回)-(2008/04/18(Fri) 18:26:44)
2008/04/18(Fri) 18:28:22 編集(投稿者)
2008/04/18(Fri) 18:28:09 編集(投稿者)

No17163 (れい さん) に返信
> ■No17144 (Hirotow さん) に返信
>>対策としては、表示前にOpacityを設定しておくとか、DoubleBufferedプロパティをTrueにするとかすればいいと思います。
>
> DoubleBufferedは子まで影響してくれません。
> 設定されたコントロールそのものの描画しか影響しません。
> ですので、DoubleBufferedを設定する対策は意味ありません。
>
> ■No17143 (小春 さん) に返信
>>さらに、貼り付けたテキストやボタンが一瞬黒くなります。
>
> いつ黒くなりますか?
> 動かすたびになりますか?
> 最初に表示させたときだけですか?
> 最小化してまた大きくしたときはどうですか?
>
> ■No17145 (小春 さん) に返信
>>これが仕様であれば、使い道がない気がします・・・。
>
> 多少ならきになりませんので、
> 程度によるでしょう。
>
> いままでそれほど困ったことはないです。


ご返答ありがとうございます。

現象としては、以下の方法で再現させています。
@フォームにテキスト10個、ボタン5個、DataGrideView1個を貼りつける。
A1つのボタンに、クリックイベントをハンドルさせ、その中に以下の1行を記述。
Me.Opacity = 0.8
Bもう1つのボタンに、同じくクリックイベントに以下の1行を記述。
Me.Opacity = 1

以上です。
操作としては、A、Bを交互にクリックするだけです。
Me.Opacity = 1の状態で、Aをクリックした場合は必ずコントロールが一瞬黒くなります。
また、最小化して大きくした場合にも、現象は確認できました。
1つ言い忘れてました。フォームサイズが小さいとそんなに気にならないのですが、
フォームサイズを750, 750ぐらいにすると、目立つと思います。

引用返信 編集キー/
■17218 / inTopicNo.6)  Re[5]: Opacityプロパティのちらつき防止について
□投稿者/ Ruku (16回)-(2008/04/18(Fri) 18:59:11)
Opacity プロパティが 100% からそれ未満になる際に発生するんですよね。
なので (私は絶対にやりませんが) 1 でなく 0.99 あたりを設定すると平気だったりします。
見た目上は透けているようには見えないでしょう。"見た目" は。

正直、こういった方法は嫌いです。何だか気持ち悪いし、他に悪影響が出ないか心配だし。
提示しておいてなんですが、私はこんな対処するならば一瞬の表示は我慢する派です。

ちなみに、結局のところ常に透過させているわけで、透過時のデメリットを常時受けることになります。
フォームのサイズを大きくしてリサイズしたりすると、かなりチカチカしたりと。
引用返信 編集キー/
■17220 / inTopicNo.7)  Re[6]: Opacityプロパティのちらつき防止について
□投稿者/ れい (489回)-(2008/04/18(Fri) 21:04:35)
2008/04/18(Fri) 21:07:12 編集(投稿者)
No17218 (Ruku さん) に返信
> Opacity プロパティが 100% からそれ未満になる際に発生するんですよね。

> 私はこんな対処するならば一瞬の表示は我慢する派です。

LayeredWindowsと通常のWindowの切り替えで発生します。
スムーズに透明度を切り替えたいアプリでは問題ですね。

かといって、254/255にしておくのは
キャプチャする人や色が重要なアプリでは問題です。
(緑色のアプリだと特に気になるかなー)

気になる人は気になりますね。

過去のコードを漁ってみましたが、
私は以下のようなコードで対処しているようです。
Formに貼り付けるとOpacityを拡張します。

およそ1以上の値を入れるとLayeredWindowを使わないように、
1を入れるとLayeredで且つ完全に不透明。
1以下だと通常の動作になります。
OverridesじゃなくてOverloadsなので注意。

    Private IsOpaqueLayered As Boolean = True
    Public Overloads Property Opacity() As Double
        Get
            If IsOpaqueLayered Then Return 1
            If MyBase.Opacity = 1 Then Return 2
            Return MyBase.Opacity
        End Get
        Set(ByVal value As Double)
            Dim alpha As Integer = 255 * value
            If alpha = 255 Then
                Form1.SetLayeredWindowAttributes(New System.Runtime.InteropServices.HandleRef(Me, Me.Handle), 0, alpha, LWA_ALPHA)
                IsOpaqueLayered = True
            Else
                IsOpaqueLayered = False
                MyBase.Opacity = value
            End If
        End Set
    End Property
    Private Const LWA_ALPHA As Int32 = 2
    Private Declare Function SetLayeredWindowAttributes Lib "User32.Dll" _
        (ByVal hWnd As IntPtr, ByVal crKey As Int32, ByVal bAlpha As Byte, ByVal dwFlags As Int32) As Boolean

引用返信 編集キー/
■17275 / inTopicNo.8)  Re[7]: Opacityプロパティのちらつき防止について
□投稿者/ 小春 (7回)-(2008/04/21(Mon) 13:57:22)
No17220 (れい さん) に返信
> 2008/04/18(Fri) 21:07:12 編集(投稿者)
>
> ■No17218 (Ruku さん) に返信
>>Opacity プロパティが 100% からそれ未満になる際に発生するんですよね。
>
>>私はこんな対処するならば一瞬の表示は我慢する派です。
>
> LayeredWindowsと通常のWindowの切り替えで発生します。
> スムーズに透明度を切り替えたいアプリでは問題ですね。
>
> かといって、254/255にしておくのは
> キャプチャする人や色が重要なアプリでは問題です。
> (緑色のアプリだと特に気になるかなー)
>
> 気になる人は気になりますね。
>
> 過去のコードを漁ってみましたが、
> 私は以下のようなコードで対処しているようです。
> Formに貼り付けるとOpacityを拡張します。
>
> およそ1以上の値を入れるとLayeredWindowを使わないように、
> 1を入れるとLayeredで且つ完全に不透明。
> 1以下だと通常の動作になります。
> OverridesじゃなくてOverloadsなので注意。
>
> Private IsOpaqueLayered As Boolean = True
> Public Overloads Property Opacity() As Double
> Get
> If IsOpaqueLayered Then Return 1
> If MyBase.Opacity = 1 Then Return 2
> Return MyBase.Opacity
> End Get
> Set(ByVal value As Double)
> Dim alpha As Integer = 255 * value
> If alpha = 255 Then
> Form1.SetLayeredWindowAttributes(New System.Runtime.InteropServices.HandleRef(Me, Me.Handle), 0, alpha, LWA_ALPHA)
> IsOpaqueLayered = True
> Else
> IsOpaqueLayered = False
> MyBase.Opacity = value
> End If
> End Set
> End Property
> Private Const LWA_ALPHA As Int32 = 2
> Private Declare Function SetLayeredWindowAttributes Lib "User32.Dll" _
> (ByVal hWnd As IntPtr, ByVal crKey As Int32, ByVal bAlpha As Byte, ByVal dwFlags As Int32) As Boolean
>

ご返答ありがとうございます。
上記ロジックで実現できました!
こんなAPIがあったんですね。勉強になりました。

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

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -