VB 5/6-Tipp 0115: Bitmap transparent einbinden Win98
von ActiveVB
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: | 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: 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-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 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?