| Wie oben beschrieben, wäre es möglich, die TransparentBlt API-Funktion aus der msimg32.dll zu verwenden, um den transparenten Text in einer Grafik über den Hintergrund zu blitten. Problem dabei ist, dass diese Funktion nur auf neueren Betriebssystemversionen vorhanden ist und daher separater Code für frühere Versionen geschrieben werden müsste (inklusive eines Versions-Checks), man könnte aber auch die msimg32.dll mit seiner Anwendung ausliefern, was aber aus lizenzrechtlichen Gründen problematisch ist (Copyright). Deshalb wird in diesem Beispiel eine erweiterte Implementierung der BitBlt API-Funktion verwendet, die TransBlt benannt wurde. Diese Prozedur maskiert die Vordergrundbitmap in einem Memory-DC (Ein DC, der nicht angezeigt wird, sondern nur im Arbeitsspeicher angelegt wird, um eine Bitmap zu speichern bzw. Grafikoperationen auf diesen DC anzuwenden. Wenn Grafikoperationen auf einen Memory DC angewendet werden, sind diese viel schneller als wenn sie auf einen sichtbaren DC angewendet werden würden.) und erstellt dann eine transparente Bitmap, die anschliessend über den Ziel-DC geblittet wird. Damit diese Funktion (wie auch die anderen BitBlt-Funktionen) funktionieren, muss die ScaleMode-Eigenschaft von Quell- und Zielobjekt auf vbPixels eingestellt werden und die Autoredraw-Eigenschaft auf True gesetzt werden. Public Sub TransBlt(ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal lngTransColor As Long) Listing 1 Wie aus den Parametern der TransBlt-Prozedur erkennbar ist, unterscheidet sich dieses Sub von der TransparentBlt API-Funktion nur dadurch, dass die Weite und Höhe auf dem Quell-DC nicht angegeben werden muss. Da es sich um ein Sub handelt, wird auch kein Wert zurückgegeben, der über den Erfolg des Funktionsaufrufs Aufschluss gibt. Es muss kein Timer-Steuerement als Zeitgeber verwendet werden, da die TransBlt-Prozedur das System kurzzeitig "blockiert" und dadurch die Anzeige verzögert. Ausserdem wird bei jedem Schleifendurchlauf DoEvents aufgerufen, damit auch andere Systemprozesse ablaufen können. Deklaration der TransparentBlt API-Funktion: Private Declare Function TransparentBlt Lib "msimg32" ( _
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 Listing 2 |