Rubrik: Oberfläche · Effekte | VB-Versionen: VB4, VB5, VB6 | 25.11.01 |
Ein-/Ausblend-Effekt mit Layered Windows SetLayeredWindowsAttributes ist ein neuer API-Befehl unter Windows2000/Me, mit dem durchsichtige Fenster erzeugt werden können. | ||
Autor: Ralf Kronen | Bewertung: | Views: 26.462 |
www.kerstel-solutions.de | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wer das Betriebssystem Windows 2000 oder Windows ME kennt, der hat sicherlich schon einmal etwas von "Layered Windows" gehört. Hierbei handelt es sich um Fenster mit eine frei skalierbaren Transparenz - einem Durschaubarkeits-Effekt.
Um solche "Layered Windows" zu erzeugen, stellt das WinAPI die SetLayeredWindowsAttributes-Funktion zur Verfügung - aber erst ab Win2000/ME. Dadurch, dass sich die Intensität der Transparenz frei einstellen lässt, kann man diese Funktion dazu verwenden, ein Fenster zeitgesteuert ein- oder auszublenden.
' zunächst die benötigten API-Deklarationen Private Declare Function SetLayeredWindowAttributes Lib "user32" ( _ ByVal hWnd As Long, _ ByVal crKey As Long, _ ByVal bAlpha As Byte, _ ByVal dwFlags As Long) As Boolean Private Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" ( _ ByVal hWnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Private Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" ( _ ByVal hWnd As Long, _ ByVal nIndex As Long) As Long Private Const GWL_EXSTYLE = -20 Private Const WS_EX_LAYERED = &H80000 Private Const LWA_COLORKEY = &H1 Private Const LWA_ALPHA = &H2
Und nachfolgend zwei Prozeduren zum Ein- und Ausblenden eines Fensters. Im ersten Paramater wird das Fensterhandle erwartet. Der zweite Paramater ist optional und legt fest, in welchem Schritt-Intervall die Form ein- bzw. ausgeblendet werden soll. Hierfür eignen sich Werte zwischen 5 und 10 ganz gut
Public Sub lwa_FadeIn(ByVal hWnd As Long, Optional ByVal iStep As Integer = 1) ' FadeIn Dim bAlpha As Integer bAlpha = 0 While bAlpha < 255 If bAlpha > 255 Then bAlpha = 255 SetLayeredWindowAttributes hWnd, 0, bAlpha, _ LWA_ALPHA DoEvents bAlpha = bAlpha + iStep Wend End Sub
Public Sub lwa_FadeOut(ByVal hWnd As Long, Optional ByVal iStep As Integer = 1) ' FadeOut Dim bAlpha As Integer bAlpha = 255 While bAlpha > 0 If bAlpha < 0 Then bAlpha = 0 SetLayeredWindowAttributes hWnd, 0, bAlpha, _ LWA_ALPHA DoEvents bAlpha = bAlpha - iStep Wend End Sub
Ein paar kurze Erklärungen:
Die SetLayeredWindowAttributes erwartet im dritten Parameter einen Wert im Bereich 0...255, wobei 0 die Form vollkommen ausblendet, d.h. die Form ist nicht mehr sichtbar und 255 dementsprechend die Form vollständig ohne jegliche Transparenz anzeigt.
Parameterbeschreibung
Beispiel
Um die "neuen" Funktion gleich testen zu können, erstellen Sie ein neues Projekt und fügen den gesamten obigen Code in den Code-Teil der Form ein.
Im Form_Load Event wird der "Einblenden"-Effekt realisiert. Hierzu wird zunächst der Fensterstil geändert, dann wird die Prozedur lwa_FadeIn aufgerufen.
Private Sub Form_Load() ' Fenster-Attribute setzen Call SetWindowLong(Me.hWnd, GWL_EXSTYLE, _ GetWindowLong(Me.hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED) Me.Show DoEvents lwa_FadeIn Me.hWnd, 5 End Sub
Den "Ausblenden"-Effekt beim Schliessen der Form erreichen Sie so:
Private Sub Form_Unload(Cancel As Integer) ' FadeOut und beenden lwa_FadeOut Me.hWnd, 5 Unload Me End End Sub
Hinweis
Wie bereits Eingangs erwähnt, funktioniert das Ganze nur unter Windows 2000, Windows ME oder höher (WinXP).