Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0575: Frame transparent machen

 von 

Beschreibung 

Manchmal möchte man ein Frame auf einer Form platzieren und das Hintergrundbild dabei erhalten. Eine Möglichkeit wäre es, statt des Frames eine Picturebox zu benutzen und ihr genau den Teil des Bildes zuzuweisen, den sie verdeckt. Es geht aber auch leichter! Frame1.BackColor darf dabei jedoch nicht auf eine Systemfarbe eingestellt sein.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CombineRgn, CreateRectRgn, DeleteObject, GetDC, GetPixel, SetWindowRgn

Download:

Download des Beispielprojektes [25,74 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 Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Rahmensteuerelement "Frame1"
' Steuerelement: Beschriftungsfeld "Label1" auf Frame1

Option Explicit

Private Sub Form_Load()
'keine Systemfarben
Frame1.BackColor = &HFF&
End Sub

Private Sub Command1_Click()
'Sub in modTransFrame
FrameTransparent Frame1
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------
Option Explicit

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) _
      As Long

Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject _
      As Long) As Long

Public Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 _
      As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 _
      As Long) As Long

Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn _
      As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _
      ByVal nCombineMode As Long) As Long

Public Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, _
      ByVal x As Long, ByVal y As Long) As Long

Public Declare Function SetWindowRgn Lib "user32" (ByVal hwnd _
      As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long

Public CtrlDc As Long

Public Function FrameTranz(Ctrl As Frame) As Long
  Dim lHoch As Long
  Dim lBreit As Long
  Dim lTemp As Long
  Dim lSkin As Long
  Dim lStart As Long
  Dim lZeile As Long
  Dim lSpalte As Long
  Dim lBackColor As Long

lSkin = CreateRectRgn(0, 0, 0, 0)

  With Ctrl
'   bei Form.ScaleMode = vbTwips
    lHoch = .Height / Screen.TwipsPerPixelY
    lBreit = .Width / Screen.TwipsPerPixelX

'   bei Form.ScaleMode = vbPixels
'   lHoch = .Height
'   lBreit = .Width

    CtrlDc = GetDC(.hwnd)
    lBackColor = Ctrl.BackColor

    For lZeile = 0 To lHoch - 1
      lSpalte = 0
      Do While lSpalte < lBreit
        Do While lSpalte < lBreit And GetPixel(CtrlDc, lSpalte, lZeile) = lBackColor
          lSpalte = lSpalte + 1
        Loop

        If lSpalte < lBreit Then
          lStart = lSpalte
          Do While lSpalte < lBreit And GetPixel(CtrlDc, lSpalte, lZeile) <> lBackColor
            lSpalte = lSpalte + 1
          Loop

          If lSpalte > lBreit Then lSpalte = lBreit
          lTemp = CreateRectRgn(lStart, lZeile, lSpalte, lZeile + 1)
          Call CombineRgn(lSkin, lSkin, lTemp, 2)
          Call DeleteObject(lTemp)
        End If
      Loop
    Next lZeile
  End With

FrameTranz = lSkin
End Function

Public Sub FrameTransparent(Ctrl As Frame)
Dim lSkin As Long
    Ctrl.Visible = True
    lSkin = FrameTranz(Ctrl)
    Call SetWindowRgn(Ctrl.hwnd, lSkin, True)
End Sub
'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- Ende Projektdatei Projekt1.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 19 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 am 02.11.2005 um 15:44

Ja sehr toll. hilft mir NULL!

Kommentar von Andü am 14.09.2005 um 23:43

...außerdem ist die Funktion auch nicht sonderich schnell! Wenn man das beim Resize macht, dauert das einfach zu lang.

Kommentar von Andü am 14.09.2005 um 13:13

Seh ich das richtig, dass man nach dem Resize der Form man das die Prozedur neu durchführen muss? Das funzt bei mir nicht richtig, da wird jeweils bloß die Hälfte des Frames mit der Hintergrundfarbe, die andere transparent angezeigt.

Kommentar von CHRTEK Network CNT am 09.05.2005 um 22:20

Versuche mal ein neues Projekt anzulegen und dann die Form und Module Files dort einzufügen (exestierende Datei einfügen) als ob du eine neue Form/Modul erstellst.

Das du das Projekt nicht öffnen kannst kann ich mir nur vorstellen wenn der Ersteller z.B. ein Professional Projekt erstellt hat und das zum download anbietet, kanns leider nicht testen da ich auf Mac umgestiegen bin :)

Kommentar von Moritz Schmale am 08.05.2005 um 21:16

Bei mir klappte nicht mal das Laden des Projektes,
liegt aber vielleicht daran, dass ich nur die Model Working Version hab.
Könntet ihr vielleicht noch ein Beispielprojekt zum Download anbieten, ich habs nämlich nicht so ganz kapiert, wo man das alles hinschreiben muss.
Danke

Kommentar von DJK am 14.03.2005 um 15:58

How make frame Transparent when Form is loading

Kommentar von Eizvber am 16.08.2004 um 07:34

Oder zuerst das Fenster me.left = screen.height + me.height + 10 und Fenster me.top = screen.width + me.wisdt + 10

Kommentar von CHRTEK Network CNT am 15.08.2004 um 16:56

Das mit dem Transparent machen beim Form_Load ma so versuchen:

me.show
' und hier den code zum transparent machen rein

Kommentar von Throgar am 30.07.2004 um 14:12

bei mir (vb5 und winxp) wird das frame unsichtbar, ich wills ja nicht 100% transparent haben man soll ja nur sehen können was dahinter ist. ich habe auch bei den funktionen das as frame mit as object ersetzt aber es funktioniert trotzdem nur bei frames...

Kommentar von ClausWARE am 31.05.2004 um 16:57

Für allen Visuellen Funktionen die eine angezeigte Form benötigen einfach innerhalb Form_Load direkt vor deren Aufruf nen Me.Show setzen.
Damit wird das Formular bereits innerhalb Form_Load sichtbar und alle Visuellen Spezial-Funktionen sollten erfolgreich funktionieren

Kommentar von Dennis am 22.05.2004 um 21:29

Hallo!

Das funktioniert wirklich super, wenn man das transparent machen durch einen Button auslöst.
Aber irgendwie will das bei mir alles nicht so recht klappen. Mit Timer ist ja schön und gut, aber wie bereits René geschrieben hat, kommt es da zu unschönen Nebeneffekten.
Mit dem form.visible = false klappt irgendwie auch nicht wirklich.
Wenn jemand einen funktionierenden Code hat, dann bitte hier posten oder an mich per EMail.

Danke, Dennis

Kommentar von Adrian am 22.05.2004 um 00:12

Renè@
Mach doch einfach am anfang das Fenster visible = False.

Kommentar von René am 21.05.2004 um 12:53

Hi,

Also erstmal ist dieser Tipp voll cool,
aber wenn ich die Funktion FrameTransparent in dem Form_Load ereignis aufrufe macht er nichts. Ist ja klar weil kein Formular angezeigt wird. Meine Frage ist, wie bekomme ich es hin, dass er mir gleich am Anfang die Frames transparent macht. Ich habe mal ein Timer eingesetzt, das funktioniert, aber man sieht den Übergang von Farbe zu transparenz und das sieht dann nicht wirklich gut aus.

mfg rené

Kommentar von nino de gennaro am 07.04.2004 um 11:52

why this routine doesn't work correctly if i set a 800x600 screen resolution and 16-bit color?

Kommentar von isi am 21.10.2003 um 10:45

Hallo cooler Tipp!!
bloss... wie kann ich ein Frame auf einem UserControl transparent machen?

Kommentar von BenniVB am 26.04.2003 um 13:04

Schon wieder ich: Noch ein Tipp: Wenn mit die Typen des Arguments "Ctrl" in den beiden Funktionen "FrameTranz" und "FrameTransparent" von "As Frame" auf "As Object" umstellt, dann funktionieren die Funktionen mit allen Controls, ohne dass man extra einen bestimmten Typ angeben muss.

Kommentar von BenniVB am 26.04.2003 um 12:59

Wahnsinn! Der Tipp ist der Oberhammer! Hey Leute, das funzt nicht nur mit Frames! Das geht mit allen Controls, wenn man die Typen-Angaben im Code entsprechend ändert. Damit ist das Problem mit Visual Styles endgültig gelöst.
Bitte benennt doch den Titel dieses Tips um. Der ist nämlich völlig untertrieben, oder vermerkt zumindest im Kommentar, dass es mit allen Controls funktioniert!

Kommentar von BenniVB am 26.04.2003 um 12:53

Mir ist gerade was aufgefallen, was diese Funktion extrem aufwertet:
Dieser Tipp bringt mich in Sachen Visual Styles in Windows XP mit VB weiter. Bekanntlich muss man ja mit dem TabStrip Container-Controls verwenden. Diese haben aber die blöde Eigenschaft, nicht durchsichtig sein zu können. Also verdecken Sie, wie bekannt, den schönen VisualStyle Hintergrund des TabStrips. Mithilfe dieses Tipp ist das Problem zum Teil gelöst. Verwendet man nämlich Frames, lässt sich hiermit der Hintergrund des Frames transparent machen, also so, dass der Visual Style des TabStrip durchscheint. Für mich verblüffend war, dass es sogar funktioniert, wenn man tranparente Labels auf dem Frame plaziert. Respekt!
Danke!

Kommentar von Elmar Leinen am 16.02.2003 um 00:33

Dieser Tip funktioniert auch mit
VB5, wenn man aus der "Projekt1.vbp"
die Zeile "Retained=0" herausgenommen hat.