Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0115: Bitmap transparent einbinden Win98

 von 

Beschreibung 

Unter Windows 98 ist der ganze Schmökes des letzten Tips überflüssig, da es eine speziell auf diese Problematik gemünzte leicht zu bedienende API gibt. Merkwürdigerweise wird bei starkem Gebrauch dieser API der Speicher immer mehr vollgefüllt, bis nichts mehr rein geht. Vermutlich werden irgendwelche DCs nicht wieder freigegeben, weiß jemand hier Rat?

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

TransparentBlt

Download:

Download des Beispielprojektes [18,81 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: Bildfeld-Steuerelement "Picture3"
' Steuerelement: Bildfeld-Steuerelement "Picture1"
' Steuerelement: Bildfeld-Steuerelement "Picture2"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Declare Function TransparentBlt Lib "msimg32.dll" _
       (ByVal hdcDest As Long, ByVal nXOriginDest As Long, _
       ByVal nYOriginDest As Long, ByVal nWidthDest As _
       Long, ByVal nHeightDest As Long, ByVal hdcSrc As _
       Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc _
       As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc _
       As Long, ByVal crTransparent As Long) As Long

Dim PMove As Boolean

Private Sub Form_Load()
  Picture1.ScaleMode = vbPixels
  Picture2.AutoRedraw = True
  Picture2.ScaleMode = vbPixels
  Picture3.Picture = Picture1.Picture
End Sub

Private Sub Picture1_Click()
  PMove = IIf(PMove, False, True)
End Sub

Private Sub Picture1_MouseMove(Button As Integer, _
                               Shift As Integer, _
                               X As Single, Y As Single)
                               
  If PMove Then Call MovePicTo(X, Y)
End Sub

Private Sub MovePicTo(ByVal X&, ByVal Y&)
  X = X - Picture2.ScaleWidth / 2
  Y = Y - Picture2.ScaleHeight / 2
  Picture1.Picture = Picture3.Picture
  Call TransparentBlt(Picture1.hDC, X, Y, Picture2.ScaleWidth, _
                      Picture2.ScaleHeight, Picture2.hDC, 0, 0, _
                      Picture2.ScaleWidth, Picture2.ScaleHeight, _
                      vbWhite)
  Picture1.Refresh
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 3 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 Jochen Wierum am 06.08.2003 um 09:32

Hallo,

In der MSDN ist volgende Zeile zu lesen: "Windows 95/98: TransparentBlt contains a memory leak that can exhaust system resources. To draw a transparent bitmap using BitBlt, see Knowledge Base article Q79212."

Es scheint so, als gäbe es keine Lösung zu diesem Problem.

Gruß,
Jochen

Kommentar von Jonathan am 25.07.2003 um 17:27

Durch den Speicherschwund ist der Tipp leider unbrauchbar.

Kommentar von am 14.07.2003 um 00:59

Wenn man im Task-Manager die Spalte "GDI-Objekte" einschaltet, und dann VB markiert, sieht man, wie sich die Zahl der GDI-Objekte beim Ausführen des Programms um zwei erhöht. Wenn man das Programm dann wieder beendet, sieht man daß die Zahl aber nur eins weniger geworden ist. D.h. nach jeder Ausführung ist ein GDI-Objekt mehr vorhanden.

So, weiß jetzt vielleicht jemand, was das bedeutet und ob sich GDI-Objekte nach dem Beenden des Programms von selbst aufräumen?