Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

WPF: Effetto AeroGlass con Visual Basic 2010

L'effetto Aero Glass è quello che consente di estendere l'area di trasparenza (quella, per intenderci, che caratterizza la barra del titolo) anche ad altre aree delle finestre delle proprie applicazioni, incluse quelle WPF. Questo effetto non è nuovo in Windows 7, esiste già da Windows Vista mentre, come potete immaginare, non è disponibile sui sistemi precedenti. In sostanza, un qualcosa di questo tipo:

Vedete come l'area di trasparenza sia estesa a tutta la finestra e non solo alla barra del titolo. Per raggiungere questo tipo di obiettivo, si ricorre ad una funzione API di Windows chiamata DwmExtendIntoClientArea, i cui argomenti sono l'handle della finestra e i 4 punti che costituiscono i margini della stessa. Questa si richiama insieme alla DwmIsCompositionEnable che consente di sapere se il Desktop Windows Manager è abilitato. Possiamo incapsulare le chiamate a queste funzioni in un modulo di Visual Basic, che esponga un metodo chiamato ExtendGlassFrame da richiamare in modalità managed:

Imports System

Imports System.Runtime.InteropServices

Imports System.Windows

Imports System.Windows.Interop

Imports System.Windows.Media

 

<StructLayout(LayoutKind.Sequential)> _

Public Structure MARGINS

    Public Sub New(ByVal t As Thickness)

        Left = CInt(t.Left)

        Right = CInt(t.Right)

        Top = CInt(t.Top)

        Bottom = CInt(t.Bottom)

    End Sub

    Public Left As Integer

    Public Right As Integer

    Public Top As Integer

    Public Bottom As Integer

End Structure

 

Module GlassHelper

    <DllImport("dwmapi.dll", PreserveSig:=False)> _

    Private Sub DwmExtendFrameIntoClientArea(ByVal hWnd As IntPtr, ByRef pMarInset As MARGINS)

    End Sub

    <DllImport("dwmapi.dll", PreserveSig:=False)> _

    Private Function DwmIsCompositionEnabled() As Boolean

    End Function

 

    Public Function ExtendGlassFrame(ByVal window As Window, ByVal margin As Thickness) As Boolean

        If Not DwmIsCompositionEnabled() Then

            Return False

        End If

 

        Dim hwnd As IntPtr = New WindowInteropHelper(window).Handle

        If hwnd = IntPtr.Zero Then

            Throw New InvalidOperationException("The Window must be shown before extending glass.")

        End If

 

        ' Set the background to transparent from both the WPF and Win32 perspectives

        window.Background = Brushes.Transparent

        HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent

 

        Dim margins As New MARGINS(margin)

        DwmExtendFrameIntoClientArea(hwnd, margins)

        Return True

    End Function

End Module

Una volta che abbiamo il codice, richiamare il metodo è semplice ma va fatto all'interno del metodo OnSourceInitialized della Window su cui applicare l'effetto:

Class MainWindow

 

    Protected Overrides Sub OnSourceInitialized(ByVal e As System.EventArgs)

        MyBase.OnSourceInitialized(e)

        GlassHelper.ExtendGlassFrame(Me, New Thickness(-1))

    End Sub

End Class

In questo modo otterremo il risultato visto sopra in figura. L'utilizzo dell'effetto Aero Glass può essere molto più complesso e a tal proposito vi segnalo un articolo disponibile in MSDN Magazine a questo indirizzo, che spiega in profondità tutti i possibili utilizzi.

Alessandro

Print | posted on mercoledì 8 settembre 2010 16:44 | Filed Under [ Visual Basic Windows Presentation Foundation ]

Powered by:
Powered By Subtext Powered By ASP.NET