Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0126: Transparentes Formular mit Hilfe von Regions entwickeln

 von 

Beschreibung 

Dieses Beispiel zeigt, wie anhand von Clipping (unter Verwendung von Regions) ein Formular teilweise Transparent gemacht werden kann.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CombineRgn, CreateRectRgn, SetWindowRgn

Download:

Download des Beispielprojektes [3,01 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Kombinationsliste "Combo1"
' Steuerelement: Listen-Steuerelement "List1"
' Steuerelement: Textfeld "txtCity"
' Steuerelement: Textfeld "txtAddress"
' Steuerelement: Textfeld "txtName"
' Steuerelement: Schaltfläche "cmdOk"
' Steuerelement: Beschriftungsfeld "Label1" (Index von 0 bis 2)

Option Explicit

Private Declare Function CreateRectRgn Lib "gdi32" (ByVal _
        X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
        ByVal Y2 As Long) As Long
        
Private Declare Function CombineRgn Lib "gdi32" (ByVal _
        hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal _
        hSrcRgn2 As Long, ByVal nCombineMode As Long) _
        As Long
        
Private Declare Function SetWindowRgn Lib "user32" (ByVal _
        hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As _
        Long) As Long
        
Const RGN_OR = 2
Const RGN_DIFF = 4

Public Sub GlassForm()
  Dim FWidth&, FHeight&, FBorder&, FTitle&
  Dim CLeft&, CTop&, CRight&, CBottom&, CRgn&, Ctrl As Control
  Dim ROuter&, RInner&, RCombined&

    If WindowState <> vbMinimized Then
      'Ganzen Form als Region festlegen
      FWidth = ScaleX(Me.Width, vbTwips, vbPixels)
      FHeight = ScaleY(Me.Height, vbTwips, vbPixels)
      ROuter = CreateRectRgn(0, 0, FWidth, FHeight)
      
      
      'Ränder und Titel abzziehen & als Region festlegen
      Me.ScaleMode = vbPixels
      FBorder = (FWidth - Me.ScaleWidth) / 2
      FTitle = FHeight - FBorder - Me.ScaleHeight
      RInner = CreateRectRgn(FBorder, FTitle, FWidth - FBorder, _
                             FHeight - FBorder)

      'Innere von der äußeren Region abziehen
      RCombined = CreateRectRgn(0, 0, 0, 0)
      Call CombineRgn(RCombined, ROuter, RInner, RGN_DIFF)

      'Regions für die einzelnen Controls ermitteln
      For Each Ctrl In Controls
        With Ctrl
          If .Container Is Me Then
            
            'Abmaße ermitteln
            CLeft = ScaleX(.Left, Me.ScaleMode, vbPixels) + FBorder
            CTop = ScaleX(.Top, Me.ScaleMode, vbPixels) + FTitle
            CRight = ScaleX(.Width, Me.ScaleMode, vbPixels) + CLeft
            CBottom = ScaleX(.Height, Me.ScaleMode, vbPixels) + CTop
            
            'Region erstellen und von der gesamten abziehen
            CRgn = CreateRectRgn(CLeft, CTop, CRight, CBottom)
            Call CombineRgn(RCombined, RCombined, CRgn, RGN_OR)
          End If
        End With
      Next Ctrl
      
      'Region zuweisen
      Call SetWindowRgn(hWnd, RCombined, True)
    End If
End Sub

Private Sub Form_Resize()
  Call GlassForm
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 7 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Sebastian Lange am 28.01.2007 um 18:10

Erstellte Regions müssen mit DeleteObject gelöscht werden.
Der Code in dieser Form führt dazu das GDI-Speicher verloren geht. Packt man den Code in das Resize-Ereigniss eines Formulars und resizt ein wenig merkt das recht schnell. Ist auch im Taskmanager unter GDI-Objekte gut zu erkennen.

Kommentar von sdf am 02.12.2005 um 16:10

und

Kommentar von Heiko Theilen am 25.05.2005 um 12:29

Wie realisiere ich in einer Transparentes Form eine Skala. Ich möchte gerne auf dem Monitor über eine Grafik eine Skala legen, um die Grafig zu messen. Danke im Voraus

Kommentar von Anonymous am 22.08.2004 um 14:33

Viele Dank für diesen Tipp aber 2 Probleme habe ich immer noch:

1. Unsichtbare Controls werden nicht transparenz
2. Transparent gesetzte Labels sind nicht transparent

Kann mir jemand sagen wie ich dieses Problem lösen kann?

Danke im Voraus

Kommentar von Peter Tübben am 16.12.2003 um 12:34

> ShapedFormCreator von Alex Vallet.

Der Mensch heisst Alex Vallat.

> (Leider habe ich die URL nicht mehr....)

http://www.byalexv.co.uk/

Grüße ... Peter

Kommentar von Ole Grossklaus am 17.09.2003 um 11:47

zu Tipp 0126

Tach:
Zu diesem Tipp gibt es ein interessantes Tool.
ShapedFormCreator von Alex Vallet.
(Leider habe ich die URL nicht mehr....)

Gruß
Ole

Kommentar von Axel am 16.03.2003 um 12:33

Tipp funktioniert gut, leider wird die vorherige WindowRgn (gerundete Ecken bei Windows XP) nicht berücksichtigt.