Symbole lassen sich in CommandButtons der CommandBars in Microsoft Office-Anwendungen, in der VB-Entwicklungsumgebung (VB-IDE) und in einigen anderen Anwendungen, die sich nach dem Microsoft-Vorbild richten, nur über die CommandButton-Methode CopyFace aus der Zwischenablage einfügen. Wenn Sie dabei eines der "eingebauten" Symbole kopieren, bereitet die Transparenz keine Schwierigkeit - die transparente Farbe erscheint immer in der vom Anwender in den Systemeinstellungen eingestellten Farbe der 3D-Oberfläche (das ist meistens, aber nicht immer und unbedingt, irgend ein Grauton). Sie können auch ein Symbol im Icon-Format aus der Zwischenablage übernehmen, wobei die Transparenz des Icon gewährt bleibt. Das Problem ist dabei nur, wie Sie in VBA oder VB per Code ein Icon in die Zwischenablage verfrachten könnten. Mit VBA- oder VB-Bordmitteln lässt sich dies nämlich nicht bewerkstelligen.
Ein kleiner Umweg löst das Problem. Sie können das Icon der Picture-Eigenschaft eines VB-Forms zuweisen, wobei die Hintergrundfarbe des Forms der aktuell eingestellten Oberflächenfarbe entspricht. Ist die Eigenschaft AutoRedraw des Forms auf True gesetzt, gibt Ihnen die Image-Eigenschaft des Forms das aus Icon und Hintergrundfarbe kombinierte Bild als Bitmap zurück. Diese Bitmap können Sie nun in die Zwischenablage einfügen.
Wir haben diese Hilfskonstruktion für Sie als kleine ActiveX-DLL implementiert, die Sie in VBA, in einem COM-AddIn (in VBA oder VB geschrieben) oder einem VB-IDE-AddIn verwenden können. Die Klasse IconToBmp ist als globales Objekt angelegt, so dass Sie die Konvertier-Methode ConvertIconToBmp aufrufen können, ohne erst explizit eine Instanz der Klasse anzulegen.
Im ersten Parameter übergeben Sie dieser Methode das zu konvertierende Icon. Da die Klasse intern ein Form anlegt, über das wie oben beschrieben das Icon umgewandelt wird, können Sie im zweiten Parameter KeepLoaded optional angeben, ob das Form nach der Konvertierung sofort wieder entladen werden soll, oder ob es geladen bleiben soll. Wenn Sie mehrere Icons nacheinander konvertieren wollen, braucht dann das Form nicht jedes Mal neu geladen zu werden. Sie können es dann über die Methode UnloadForm abschließend entladen, oder sie lassen es einfach erhalten, bis das globale Klassen-Objekt beim Beenden Ihrer Anwendung terminiert und dabei das Form, falls noch geladen, automatisch entlädt.
Die Größe des Icons bzw. der resultierenden Bitmap legen Sie im optionalen Parameter IconSize fest. Voreingestellt ist der Wert isSmall aus der Enumeration IconSizeConstants für 16x16-Icons bzw. -Bitmaps. Geben Sie isLarge an, wird eine 32x32 Pixel große Bitmap zurückgegeben. Wenn Sie eine 16x16-Bitmap erhalten wollen, darf das Icon auch nur das 16x16-Format enthalten - anderenfalls würde das 32x32-Symbol übernommen und abgeschnitten, jedoch nicht angepasst.
Im weiteren optionalen Parameter CopyToClipboard geben Sie an, ob die Bitmap gleich in die Zwischenablage übernommen werden soll. Denn auch dieses ist zumindest in VBA-Code nicht so einfach möglich, und kann daher hier gleich erledigt werden.
Im ebenfalls optionalen Parameter BackColor können Sie schließlich noch eine andere Hintergrundfarbe festlegen, falls Sie die Konvertierung für andere Zwecke einsetzen wollen.
In der Methode ConvertIconToBmp wird zunächst geprüft, ob ein gültiger Wert für IconSize übergeben wurde. Dann wird das Hilfs-Form geladen, falls es noch nicht geladen war. In dessen Methode ConvertIcon wird nun, wie oben beschrieben, das Icon in eine Bitmap umgewandelt. Ist CopyToClipboard gesetzt, wird die umgewandelte Bitmap in die Zwischenablage übernommen. Zum Schluss wird das Form wieder entladen, falls der Parameter KeepLoaded nicht gesetzt ist.
Der Code der Klasse IconToBmp:
Private mForm As frmIcon
Public Enum IconSizeConstants
isSmall
isLarge
End Enum
Public Function ConvertIconToBmp(Icon As StdPicture, _
Optional ByVal KeepLoaded As Boolean, _
Optional ByVal IconSize As IconSizeConstants, _
Optional ByVal CopyToClipboard As Boolean, _
Optional ByVal BackColor As OLE_COLOR = vb3DFace) _
As StdPicture
Dim nPicture As StdPicture
Select Case IconSize
Case isSmall, isLarge
Case Else
Err.Raise 380
End Select
If mForm Is Nothing Then
Set mForm = New frmIcon
Load mForm
End If
Set nPicture = mForm.ConvertIcon(Icon, BackColor, IconSize)
If CopyToClipboard Then
With Clipboard
.Clear
.SetData nPicture, vbCFBitmap
End With
End If
Set ConvertIconToBmp = nPicture
If Not KeepLoaded Then
Unload mForm
Set mForm = Nothing
End If
End Function
Public Sub UnloadForm()
Class_Terminate
End Sub
Private Sub Class_Terminate()
If Not (mForm Is Nothing) Then
Unload mForm
Set mForm = Nothing
End If
End Sub
Der Code des Hilfs-Forms zur Konvertierung:
Public Function ConvertIcon(Icon As StdPicture, _
ByVal BackColor As OLE_COLOR, ByVal IconSize As IconSizeConstants) _
As StdPicture
With Me
Select Case IconSize
Case isSmall
.Move 0, 0, 16 * Screen.TwipsPerPixelX, _
16 * Screen.TwipsPerPixelY
Case isLarge
.Move 0, 0, 32 * Screen.TwipsPerPixelX, _
32 * Screen.TwipsPerPixelY
End Select
.BackColor = BackColor
Set .Picture = Icon
Set ConvertIcon = .Image
Set .Picture = Nothing
End With
End Function
|