Rubrik: Controls · UserControl | VB-Versionen: VB5, VB6 | 24.10.05 |
Fake-Transparenz im UserControl Vorgetäuschte Transparenz für das UserControl, indem der Hintergrund des Container-Objekts als Bild in das UserControl kopiert wird | ||
Autor: Philipp Heinze | Bewertung: | Views: 13.454 |
www.phsoftware.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wollen Sie ihrem UserControl Transparenz hinzufügen, aber trotzdem alle Maus-Events (Klicks, etc.) erhalten? Also auch die Mausklicks, die im transparenten Bereich ausgelöst werden?
Dann kopieren Sie einfach den Hintergrund des Control-Containers in den Hintergrund ihres Controls.
Code für das UserControl
Option Explicit ' Benötigte API-Deklarationen Private Declare Function BitBlt Lib "gdi32" ( _ ByVal hDestDC As Long, _ ByVal X As Long, _ ByVal Y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal hSrcDC As Long, _ ByVal xSrc As Long, _ ByVal ySrc As Long, _ ByVal dwRop As Long) As Long Private Const SRCCOPY As Long = &HCC0020 Private Declare Function GetDC Lib "user32.dll" ( _ ByVal hwnd As Long) As Long Private Declare Function SendMessage Lib "user32.dll" _ Alias "SendMessageA" ( _ ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByRef lParam As Any) As Long Private Const WM_PAINT As Long = &HF& Public Event Click()
Private Sub UserControl_Click() ' Klick-Event auslösen RaiseEvent Click End Sub
Private Sub UserControl_Initialize() ' ScaleMode auf Pixel festlegen UserControl.ScaleMode = vbPixels End Sub
Public Sub Refresh() ' UserControl transparent machen Dim nScaleMode As Integer With UserControl ' UserControl ausblenden, damit der dahinter liegende ' Hintergrund kopiert werden kann .Extender.Visible = False ' Inhalt löschen .Cls ' ScaleMode auf Pixel festgelegen nScaleMode = .Parent.ScaleMode .Parent.ScaleMode = vbPixels ' Wichtig! .AutoRedraw = True ' Neuzeichnen-Nachricht an das Container-Objekt senden, ' auf das sich das UserControl befindet SendMessage .ContainerHwnd, WM_PAINT, GetDC(.ContainerHwnd), 0 ' Hintergrundbild kopieren BitBlt .hDC, 0, 0, .Width, .Height, GetDC(.ContainerHwnd), .Extender.Left, .Extender.Top, SRCCOPY ' Hintergrund als neues Bild unseres UserControls setzen .Picture = .Image ' optional: ' Rahmen zeichnen UserControl.Line (0, 0)-(.ScaleWidth - 1, .ScaleHeight - 1), vbRed, B ' und bspw. noch einen Text ausgeben .CurrentY = 3: .CurrentX = 3 UserControl.Print "Klick me!" .AutoRedraw = False ' UserControl wieder sichtbar machen .Extender.Visible = True End With End Sub
Private Sub UserControl_Show() ' Beim erstmaligem Anzeigen des UserControls ' Hintergrund transparent machen Static bShown As Boolean If bShown Then Exit Sub If Not Ambient.UserMode Then Exit Sub bShown = True Refresh End Sub
Wichtig: Wann immer sich der Hintergrund des Container-Objekts ändert, müssen Sie die Refresh-Methode des UserControls aufrufen, damit sich der Hintergrund des UserControls an den neuen Hintergrund anpasst.