Pour recevoir la prime, veuillez fournir une réponse avec le code de travail. Merci.Comment convertir une image stdole.StdPicture en un type différent?
J'ai un objet stdole.StdPicture du type vbPicTypeIcon. J'ai besoin de le convertir en Type vbPicTypeBitmap. En raison des contraintes du projet, je dois être capable de le faire en utilisant Win32 ou VBA. J'essaie de charger l'icône d'un fichier dans un bouton de la barre de commande. Voici ce que j'ai jusqu'ici. Il produit un joli carré noir :) Je suis vraiment nouveau à la terre graphique alors pardonnez-moi si c'est une question fondamentale.
Option Explicit
Private Const vbPicTypeBitmap As Long = 1
Private Const vbPicTypeIcon As Long = 3
Private Const SHGFI_ICON As Long = &H100&
Private Const SHGFI_SMALLICON As Long = &H1&
Private Type PICTDESC
cbSize As Long
pictType As Long
hIcon As Long
hPal As Long
End Type
Private Type typSHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * 260
szTypeName As String * 80
End Type
Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long
Private Declare Function SHGetFileInfoA Lib "shell32.dll" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As typSHFILEINFO, ByVal cbSizeFileInfo As Long, ByVal uFlags As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (lpPictDesc As PICTDESC, riid As Any, ByVal fOwn As Long, ipic As stdole.IPictureDisp) As Long
Public Sub Test()
Dim btn As Office.CommandBarButton
Dim lngRslt As Long
Dim lngAppInstc As Long
Dim strFilePath As String
Dim tFI As typSHFILEINFO
Dim pic As stdole.IPictureDisp
Set btn = TestEnv.GetTestButton
lngAppInstc = Excel.Application.Hinstance
strFilePath = TestEnv.GetTestFile
If LenB(strFilePath) = 0& Then
Err.Raise 70&
End If
SHGetFileInfoA strFilePath, 0&, tFI, LenB(tFI), SHGFI_ICON Or SHGFI_SMALLICON
Set pic = IconToPicture(tFI.hIcon)
btn.Picture = pic
Exit_Proc:
On Error Resume Next
If tFI.hIcon Then
lngRslt = DestroyIcon(tFI.hIcon)
End If
Exit Sub
Err_Hnd:
MsgBox Err.Description, vbCritical Or vbMsgBoxHelpButton, Err.Number, Err.HelpFile, Err.HelpContext
Resume Exit_Proc
Resume
End Sub
Private Function IconToPicture(ByVal hIcon As Long) As stdole.IPictureDisp
'Modified from code by Francesco Balena on DevX
Dim pic As PICTDESC
Dim guid(0 To 3) As Long
Dim pRtnVal As stdole.IPictureDisp
pic.cbSize = LenB(pic)
'pic.pictType = vbPicTypeBitmap
pic.pictType = vbPicTypeIcon
pic.hIcon = hIcon
' this is the IPicture GUID {7BF80980-BF32-101A-8BBB-00AA00300CAB}
' we use an array of Long to initialize it faster
guid(0) = &H7BF80980
guid(1) = &H101ABF32
guid(2) = &HAA00BB8B
guid(3) = &HAB0C3000
' create the picture,
' return an object reference right into the function result
OleCreatePictureIndirect pic, guid(0), True, pRtnVal
Set IconToPicture = pRtnVal
End Function
Mon code ci-dessous, tout en ayant besoin nettoyé, utilise uniquement l'API et fait exactement ce que vous voulez. Il y a un formulaire et une image dans l'échantillon seulement pour démontrer que cela fonctionne. – jac
Salut Beaner, Il y a eu beaucoup de modifications donc vous l'avez peut-être manqué. Mais la solution DOIT fonctionner en VBA. VBA n'a pas de Picture Control. Ce qui est malheureusement pourquoi je pose cette question du tout :) Désolé pour toute confusion. – Oorang
Vous l'avez probablement manqué, mais la zone d'image ne faisait plus partie de la conversion. Je l'ai laissé là pour afficher l'image convertie dans l'exemple. Comme je l'ai dit, je n'ai pas eu le temps de nettoyer le code. Maintenant, il a été nettoyé certains et j'ai enlevé la boîte d'image tout à fait pour enlever la confusion.La conversion est ALL WinAPI – jac