VB 5/6-Tipp 0126: Transparentes Formular mit Hilfe von Regions entwickeln
von Matt Hart
Beschreibung
Dieses Beispiel zeigt, wie anhand von Clipping (unter Verwendung von Regions) ein Formular teilweise Transparent gemacht werden kann.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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.