DWM APIを使用してVB.NET 2010アプリのフォームにAero Glassを表示しようとしていますが、関数呼び出しが示唆するように、フレームの外観をクライアント領域に拡張します。フォームに境界線がない場合、何も起こらず、フォームが形成されます見えなくなります。ということで、縁なしの形でエアログラスを手に入れることはできるのでしょうか....??
1 に答える
あなたが言ったようDwmExtendFrameIntoClientArea
に、ウィンドウのフレームの透明なガラス効果をクライアント領域に文字通り拡張します。つまり、フォームFormBorderStyle
が「なし」に設定されている場合、ウィンドウは事実上見えなくなります。
DwmEnableBlurBehindWindow
代わりに、 APIを使用する必要があります。これにより、フレーム/境界線を必要とせずにウィンドウでガラス状のぼかし効果が有効になります。2 つのパラメータを取ります。最初の ( hWnd
) は、ぼかし効果を適用するフォームのハンドルです。2 番目の ( pBlurBehind
) は、効果のデータまたはパラメーターを含む、参照によって渡される構造体です。
したがって、それ自体が 4 つのメンバーを含むDWM_BLURBEHIND
構造体も定義する必要があります。最初の ( ) は、この構造体のどのメンバーが設定されているかを示す定数値dwFlags
のビットごとの組み合わせです。2 番目の ( ) は、ぼかし効果を有効にするか無効にするかを示します。3 番目 ( ) では、ぼかし効果が適用されるクライアント領域内の特定の領域を指定できます。これを に設定すると、クライアント領域全体にぼかし効果が適用されます。4 番目の ( ) では、最大化されたウィンドウに合わせてフォームの色を変更するかどうかを指定できます。fEnable
hRgnBlur
Nothing
fTransitionOnMaximized
この関数を使用するためにコードに含める必要がある最終的な API 宣言は次のとおりです。
<StructLayout(LayoutKind.Sequential)> _
Private Structure DWM_BLURBEHIND
Public dwFlags As Integer
Public fEnable As Boolean
Public hRgnBlur As IntPtr
Public fTransitionOnMaximized As Boolean
End Structure
Private Const DWM_BB_ENABLE As Integer = &H1
Private Const DWM_BB_BLURREGION As Integer = &H2
Private Const DWM_BB_TRANSITIONONMAXIMIZED As Integer = &H4
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Private Shared Sub DwmEnableBlurBehindWindow(ByVal hWnd As IntPtr, ByRef pBlurBehind As DWM_BLURBEHIND)
End Sub
次に、特定のフォームでこの関数を呼び出す方法の簡単な例を示します。
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
''#Set the form's border style to None
Me.FormBorderStyle = FormBorderStyle.None
''#Whatever region that you fill with black will become the glassy region
''# (in this example, the entire form becomes transparent)
Me.BackColor = Color.Black
''#Create and populate the blur-behind structure
Dim bb As DWM_BLURBEHIND
bb.dwFlags = DWM_BB_ENABLE
bb.fEnable = True
bb.hRgnBlur = Nothing
''#Enable the blur-behind effect
DwmEnableBlurBehindWindow(Me.Handle, bb)
End Sub
代わりに、フォームの特定のサブ領域にのみぼかし効果を適用する場合は、メンバーに有効な領域を指定し、メンバーにフラグをhRgnBlur
追加する必要があります。DWM_BB_BLURREGION
dwFlags
Region.GetHrgn
メソッドを使用して、hRgnBlur
メンバーとして指定するリージョンへのハンドルを取得できます。たとえば、上記のコードの代わりに、次のコードを使用できます。
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
''#Set the form's border style to None
Me.FormBorderStyle = FormBorderStyle.None
''#Fill the entire form with black to make it appear transparent
Me.BackColor = Color.Black
''#Create a region corresponding to the area of the form you want to render as glass
Using g As Graphics = Me.CreateGraphics
Dim glassRect As New Rectangle(0, 0, 100, 150)
Using rgn As New Region(glassRect)
''#Create and populate the blur-behind structure
Dim bb As DWM_BLURBEHIND
bb.dwFlags = DWM_BB_ENABLE Or DWM_BB_BLURREGION
bb.fEnable = True
bb.hRgnBlur = rgn.GetHrgn(g)
''#Enable blur-behind effect
DwmEnableBlurBehindWindow(Me.Handle, bb)
End Using
End Using
End Sub
ぼかし効果を適用する特定のサブ領域を指定した場合でも、フォーム全体の背景色を黒に設定していることに注意してください。これにより、指定した領域がガラス状のぼかし効果でレンダリングされ、フォームの残りの部分が透明に表示されます。もちろん、フォームの残りの背景色を任意の色に設定できます (ただし、ガラスとして表示したい四角形は、以前と同様に黒で塗りつぶしてください)、部分的に透明に表示されます。 、ガラスのようなぼかし効果がありません。MSDNは、その理由を次のように説明しています。
ウィンドウのサブ領域にぼかしエフェクトを適用すると、ウィンドウのアルファ チャネルがぼかしのない領域に使用されます。これにより、ウィンドウのぼやけていない領域で予期しない透明度が発生する可能性があります。したがって、部分領域にぼかし効果を適用するときは注意してください。
私に関する限り、この効果をフォームのウィンドウの部分領域のみに適用することは、比較的価値がありません。それが理にかなっているような気がするのは、フォームの残りの部分を透明のままにして、任意の非長方形をガラス状にレンダリングしたい場合だけです。