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