XL 2013 api createmetafile ne fonctionne pas comme createenHmetafile

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
j'ai un soucis avec la sauvegarde directe d'un object (shape picture, etc..) en WMF sans passer par olecreatepictureindirect
si quelqu'un sait je prends

VB:
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function CopyMetaFileA Lib "gdi32" (ByVal hmf As LongPtr, ByVal lpFileName As String) As LongPtr
Private Declare PtrSafe Function DeleteEnhMetaFile Lib "gdi32" (ByVal hEmf As LongPtr) As Long
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal Format As Long) As Long

'LA FONCTION POUR LE FORMAT WMF
Function copyObjToWmfFile(obj As Object, Optional cheminX = "")
    Dim hMeta As LongPtr, hCopy As LongPtr
    If cheminX = "" Then cheminX = ThisWorkbook.Path & "\captureObject.Wmf"
    ' Copier la shape au format Metafile
    OpenClipboard (0): EmptyClipboard: CloseClipboard
    obj.CopyPicture
    ' Récupérer l'image en Metafile dans le presse papier et le sauve vers un fichier
    If OpenClipboard(0) Then
       Debug.Print "available in clip : " & IsClipboardFormatAvailable(&H3)
       If IsClipboardFormatAvailable(&H3) = 0 Then MsgBox " pas de meta dans le clip": Exit Function
       hMeta = GetClipboardData(&H3) ' VF_METAFILE = 0x3 (format WMF)soit au format Hex "&H3"
        Debug.Print "Handle hMeta : " & hMeta
        If hMeta <> 0 Then hCopy = CopyMetaFileA(hMeta, cheminX) ' Copier l'EMF dans un fichier
        Debug.Print "hcopy : " & hCopy
        DeleteEnhMetaFile hCopy ' Libérer la mémoire
    End If
    CloseClipboard ' Fermer le presse-papiers
    copyObjToWmfFile = cheminX
End Function

Sub TestF()
    copyObjToWmfFile ActiveSheet.Shapes("boule"), Environ("userprofile") & "\DeskTop\wmfboule.wmf"
End Sub
 
Solution
Oui j'ai fait un test et ca fonctionnait mais désolé le code que j'ai tapé n'"était pas précis , il faut récupérer l'adresse de la structure METAFILEPICT
ensuite ajouter un décalage de 12 octets qui correspondent aux 3 Longint pour avoir finalement l'adresse du handle de meafile je pense que c'est assez intuitif .

Code:
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function CopyMetaFileA Lib "gdi32" (ByVal hmf As LongPtr...
je te l'ai dit déjà
W7 et office 2007 sur vieux pc portable perso heu....jurassicPC + de 17 ans
W10 et office 2013 pro plus sur mon PC :il a 3 ans
W10 et office 2016 sur PC portable du boulot :il a 5 ans
W11 365 excel 2021 sur pc fixe du boulot: 1 ans même pas

les 4 je n'ai pas de soucis avec copyXlPicture
Il peut y a avoir aussi d'autres paramètres comme la résolution d'écran , le facteur d'échelle etc ...
Bon je vais mettre en standby pour l'instant et faire des tests complémentaires si il y a du nouveau je le signalerai
 
a bon je n'aurais jamais imaginé que la résolution de l’écran ai à voir quelque chose
si mon image testB passe dans une feuille et dans les activX chez toi
alors c'est simple ,c'est les api qui ne travaillent pas comme elle devraient chez toi il faut chercher de ce coté là
 
Hello,
bon j'ai un peu de nouveau concernant le problème.
1 - Sur un Excel 2010 sous Win7 , je n'ai apparemment pas de pb avec les wmf.
2 - Sur un Excel 2021 64 bits mon bébé.wmf mis dans un commentaire en visualisation dans un contrôle image de userform ne se charge pas il y a une erreur sur le LoadPicture.
J'ai comparé le wmf original et celui qui est à l'intérieur du xlsm : ils ne sont pas identiques. Si on les charge dans mspaint on voit tout de suite la
différence l'original à une taille de 366 x 383 pixels tandis que celle qui est à l'intérieur du xlsm fait 7752 x 8098 pixels ce qui doit provoquer l'erreur dans le loadpicture. Si dans mspaint on réduit la taille de l'image visuellement c'est la même chose que l'original.
Ami calmant, J.P
 
Bonjour @jurassic pork
oui quand on sauve une image en wmf dans excel , excel agrandi l'image
je crois que l'on y peut rien j'ai tourné ça dans tout les sens
c’était déjà pour ça que je passait pas olecreatepictureindirect pour avoir un hybride emf/wmf utilisable dans les activX dans userforms avec un object IpictureDisp
mais quand j'utilise le vrai wmf (créé avec fonction issue de @Rheem) il s'affiche dans excel dans paint aussi

mais l'export quand on le met dans les commentaires provoque une erreur de compilation de fichier
il n'est même plus exploitable en sortie par quoi que ce soit
 
Ce que j'ai repéré c'est que les wmf qui ne passent pas ont une échelle de 0,2 à l'origine. Je suis parti d'un fichier svg récupéré sur le net et j'ai converti ce fichier en wmf et emf avec inkscape. Les fichiers wmf et emf ont une échelle 1. Et maintenant si je met le fichier emf dans un commentaire et que je visualise le fichier qui est dans le xlsm ça passe avec LoadPicture :
PigEmf.png


En pièce jointes les images svg, wmf et emf
 

Pièces jointes

perso moi j'en ai conclu que le wmf c'est pas bon pour les commentaires trop de variable et variante à gérer
et à ce que je vois c'est un EMF et non un WMF
ce que j'en conclus c'est que les Excels récents n'aiment pas les wmf et les emf qui n'ont pas une échelle raisonnable. ce qui fait qu'il ont une taille gigantesque. La conversion wmf vers emf n'est pas bonne. On ne trouve pas facilement des cliparts emf sur le net , par contre le svg semble être le standard pour les cliparts actuels. On peut convertir les svg en emf par inkscape ou par un convertisseur en ligne svg -> emf (il en existe pleins de gratuit).
En pièce jointe un de tes frères et un de tes cousins en svg et convertis en emf par un convertisseur svg -> emf en ligne gratuit.
Donkey.png


A noter que les fichiers vectoriels sont de moins bonne qualité dans un contrôle image de userform que dans un navigateur car il ne semble pas y avoir d'"anti-aliasing".
 

Pièces jointes

Dernière édition:
faut pas oublier que les emf ou wmf proviennent surtout de capture donc il est important
ma fonction copypicture renvoie un ipicturedisp pour une utilisation dans activX
celle qui sauve directe en EMF visiblement fonctionne aussi (y compris dans les commentaires)
après le svg a moins que l'on est la possibilité de le gérer en vba ,n'a pas de grand intérêt
 
@Dudu2 ma fonction copyxlpicture est parfaite pour afficher une image d'une feuille dans un control image dans un userform
elle permet de garder les partie complétement transparentes


1°'afficher une image ou une shape ou picture d'une feuille dans un userform
c'est la copyxlPicture

2° enregistrer une shape ou picture ou même range en EMF
c'est la copyObjToEmfFile

3°enregistrer une picture ou shape ou même range en BMP
c'est la CopyBitmapPicture

4°enregistrer une picture ou shape ou même rangeen png
c'est la CopyPngPicture

5° enregistrer une picture ou shape ou même range en WMF(non utilisable dans les commentaires )
c'est la copyObjToWmfFile2

module de tests

VB:
Sub TestA()
    copyxlPicture ActiveSheet.Shapes("boule"), Environ("userprofile") & "\DeskTop\wmfboule.wmf"
End Sub

Sub testAb()
    With UserForm1
        .Show 0
        .Image1.Picture = copyxlPicture(ActiveSheet.Shapes("boule"))
    End With
End Sub


Sub TestB()
    copyObjToEmfFile ActiveSheet.Shapes("boule"), Environ("userprofile") & "\desktop\emfboule.emf" ' À remplacer selon le bon index
End Sub


Sub TestD()
    CopyPngPicture [A1:C7], Environ("userprofile") & "\desktop\output2.png" ', True'le 3eme argumen(true/false) pour laisser la transparence pour les range
End Sub

Sub TestE()
    CopyBitmapPicture ActiveSheet.Shapes("boule"), Environ("userprofile") & "\desktop\output.bmp"
End Sub

Sub TestF()
    copyObjToWmfFile2 ActiveSheet.Shapes("image 8"), Environ("userprofile") & "\DeskTop\couronne TesCC.wmf"
End Sub
module des fonctions
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'Module de copie en image (JPG / EMF / WMF / PNG / BMP) de tout object sur feuille(Range / Shapes / Graphique /  etc...)
's'en servir dans un control image dans un userform
'ou exporter
'patricktoulon sur developpez.com
'utilisation d'un  clisd pour la structure IPictureIID pour le Bitmap
'date/22/03/2010
'remasteurisation du code date: 12/09/2023
'api creation object image
'mise ajour 18/09/2023
'ajout de la fonction copyObjToEmfFile( fichier ".EMF")
'abandon du vb6
'mise  à  jour 15/11/2024
'Ajout de la fonction CopyPngPicture
'ajout de l'export en WMF directe
'intervenant
'@patricktoulon
'@jurassic pork
'@Rhemm
 
Option Explicit
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function RegisterClipboardFormatW Lib "user32" (ByVal lpszFormat As LongPtr) As Long
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal Format As Long) As Long
Private Declare PtrSafe Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long

Private Declare PtrSafe Function CopyEnhMetaFileA Lib "gdi32" (ByVal HwndImage As LongPtr, ByVal Direction As String) As LongPtr
Private Declare PtrSafe Function CopyMetaFileA Lib "gdi32" (ByVal hmf As LongPtr, ByVal lpFileName As String) As LongPtr
Private Declare PtrSafe Function DeleteMetaFile Lib "GDI32.dll" (ByVal hmf As LongPtr) As Long
Private Declare PtrSafe Function DeleteEnhMetaFile Lib "gdi32" (ByVal hEmf As LongPtr) As Long
Private Declare PtrSafe Function CopyImage Lib "user32" (ByVal handle As LongPtr, ByVal un1 As LongPtr, ByVal n1 As LongPtr, ByVal n2 As LongPtr, ByVal un2 As LongPtr) As LongPtr
Private Declare PtrSafe Function OleCreatePictureIndirect Lib "oleaut32.dll" (pPictDesc As PICTDESC, ByRef riid As GUID, ByVal fOwn As Long, ByRef ppvObj As IPicture) As Long
Private Declare PtrSafe Function IIDFromString Lib "ole32" (ByVal lpsz As String, ByRef lpiid As GUID) As LongPtr

Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As Long)
Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32" (Destination As Any, ByVal Source As LongPtr, ByVal Length As LongPtr)

Type RECT: Left As Long: top As Long: Right As Long: BOTTOM As Long: End Type
Type GUID: Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(0 To 7) As Byte: End Type
Type PICTDESC: cbSize As Long: picType As Long: hImage As LongPtr: hpal As LongPtr: End Type


'--------------------------------------------------------------------------------------------------------
'--------------------------------------------------------------------------------------------------------
'LA FONCTION POUR LE FORMAT WMF renvoi un object IpictureDisp
Function copyxlPicture(obj, Optional lPath As String = "") As IPicture
    '@patricktoulon
    Dim hCopy As LongPtr, PictStructure As PICTDESC, DispatchInfo As GUID, ipic As IPicture, T#
    obj.CopyPicture
    OpenClipboard 0
    T = Timer
    Do While hCopy = 0
        hCopy = CopyEnhMetaFileA(GetClipboardData(&HE), vbNullString)
        If Timer - T > 1 Then Exit Do
    Loop
    CloseClipboard
    If hCopy = 0 Then Set copyxlPicture = ipic: Exit Function ' si pas de handleimage WMF dans clip on arrete tout
    With DispatchInfo
        .Data1 = &H7BF80980: .Data2 = &HBF32: .Data3 = &H101A: .Data4(0) = &H8B: .Data4(1) = &HBB
        .Data4(2) = &H0: .Data4(3) = &HAA: .Data4(4) = &H0: .Data4(5) = &H30: .Data4(6) = &HC: .Data4(7) = &HAB
    End With
    With PictStructure: .cbSize = Len(PictStructure): .picType = 4: .hImage = hCopy: .hpal = 0: End With
    OleCreatePictureIndirect PictStructure, DispatchInfo, True, ipic
    Set copyxlPicture = ipic
    If lPath <> "" Then SavePicture ipic, lPath: Set ipic = Nothing
    OpenClipboard 0: EmptyClipboard: CloseClipboard
End Function

'--------------------------------------------------------------------------------------------------------
'--------------------------------------------------------------------------------------------------------
'LA FONCTION POUR LE FORMAT EMF
Function copyObjToEmfFile(obj As Object, Optional cheminX = "")
    '@patricktoulon
    '@jurassic pork
    Dim hMeta As LongPtr, hCopy As LongPtr
    If cheminX = "" Then cheminX = ThisWorkbook.Path & "\captureObject.emf"
    ' Copier la shape au format Metafile
    obj.CopyPicture
    ' Récupérer l'image en Metafile dans le presse papier et le sauve vers un fichier
    If OpenClipboard(0) Then
        hMeta = GetClipboardData(&HE) ' CF_ENHMETAFILE = 0x14 (format EMF)soit au format Hex "&HE"
        If hMeta <> 0 Then hCopy = CopyEnhMetaFileA(hMeta, cheminX) ' Copier l'EMF dans un fichier
        DeleteEnhMetaFile hCopy ' Libérer la mémoire
    End If
    CloseClipboard ' Fermer le presse-papiers
    copyObjToEmfFile = cheminX
End Function



'--------------------------------------------------------------------------------------------------------
'--------------------------------------------------------------------------------------------------------
'LA FONCTION POUR LE FORMAT BMP
Function CopyBitmapPicture(obj As Object, Optional lPath As String = "")
    'patricktoulon
    Dim ipic As IPicture, hCopy As LongPtr, tIID As GUID, PictStructure As PICTDESC, x#, ret As LongPtr
    Call OpenClipboard(0): EmptyClipboard: CloseClipboard
    obj.CopyPicture Format:=xlBitmap
    OpenClipboard 0&
    x = Timer
    Do While (hCopy = 0)
        hCopy = CopyImage(GetClipboardData(&H2), 0, 0, 0, &H8)
        If Timer - x > 1 Then Exit Do
    Loop
    CloseClipboard
    If hCopy = 0 Then Set CopyBitmapPicture = ipic: Exit Function
    Const IPictureIID = "{7BF80981-BF32-101A-8BBB-00AA00300CAB}"
    ret = IIDFromString(StrConv(IPictureIID, vbUnicode), tIID)
    If ret Then Set CopyBitmapPicture = ipic: Exit Function
    With PictStructure: .cbSize = Len(PictStructure): .picType = 1: .hImage = hCopy: End With
    ret = OleCreatePictureIndirect(PictStructure, tIID, 1, ipic)
    If ret Then Set CopyBitmapPicture = ipic: Exit Function
    Set CopyBitmapPicture = ipic
    If lPath <> "" Then SavePicture ipic, lPath: Set ipic = Nothing
    OpenClipboard 0: EmptyClipboard: CloseClipboard
End Function

'--------------------------------------------------------------------------------------------------------
'--------------------------------------------------------------------------------------------------------
'LA FONCTION POUR LE FORMAT PNG
Public Function CopyPngPicture(obj As Object, lPath As String, Optional RangeTransparency As Boolean = False) As Variant
    'patricktoulon
    Dim i&, hClipMemory As LongPtr, lpClipMemory As LongPtr, memSize As Long, apiRetVal As Long, dataFormat, tmpBuffer() As Byte
    If TypeName(obj) = "Range" Then
        obj.CopyPicture ' on reste en xlpicture par defaut(la capture est de meilleure qualité)
        obj.Parent.Paste 'on recole sur la feuille
        If Not RangeTransparency Then
            Selection.ShapeRange.Fill.ForeColor.RGB = vbWhite 'on mremet le fond en blanc
            Selection.ShapeRange.Fill.Visible = True 'le fond est visible
        End If
        Selection.Copy 'on recopie la capture donc une image (copy tout court pour disposer des formats dans le clipboard)
        Selection.Delete 'on peut supprimer l'image temporaire
        Do Until IsClipboardFormatAvailable(14) > 0 Or i > 1000: i = i + 1: DoEvents: Loop
    Else
        obj.Copy 'si c'est une shapes , picture , ou tout autre object(sauf range) on copy tout court
    End If
    dataFormat = RegisterClipboardFormatW(StrPtr("PNG"))
    If Not CBool(OpenClipboard(0)) Then MsgBox "L'Ouverture tu ClipBord a échoué": CopyPngPicture = False: Exit Function
    If Not CBool(IsClipboardFormatAvailable(dataFormat)) Then MsgBox "Aucun Png dispo dans le clipboard": CopyPngPicture = False: Exit Function
    hClipMemory = GetClipboardData(dataFormat)
    If Not CBool(hClipMemory) Then MsgBox "Aucun Stream de Png dispo dans le clipboard": CopyPngPicture = False: Exit Function
    memSize = GlobalSize(hClipMemory)
    lpClipMemory = GlobalLock(hClipMemory)
    If CBool(lpClipMemory) Then
        ReDim tmpBuffer(0 To memSize - 1) As Byte
        Call CopyMemory(VarPtr(tmpBuffer(0)), lpClipMemory, memSize)
        apiRetVal = GlobalUnlock(hClipMemory)
    Else
        MsgBox " Récupération du STREAM du png a echoué": Exit Function
    End If
    Open lPath For Binary Access Write As #1: Put #1, 1, tmpBuffer: Close #1
    CopyPngPicture = lPath
    EmptyClipboard
    CloseClipboard
End Function
'LA FONCTION POUR LE FORMAT WMF
Sub TestF()
    copyObjToWmfFile2 ActiveSheet.Shapes("boule"), Environ("userprofile") & "\DeskTop\wmfboule.wmf"
End Sub
Function copyObjToWmfFile2(obj As Object, Optional cheminX = "")
   '@Rheeem
   '@Patricktoulon
   Dim hMeta As LongPtr, hCopy As LongPtr, hGlobal As LongPtr
    If cheminX = "" Then cheminX = ThisWorkbook.Path & "\captureObject.Wmf"
     OpenClipboard (0): EmptyClipboard: CloseClipboard 'vide le clipboard
    obj.CopyPicture ' Copier la shape au format Metafile
      ' Récupérer l'image en Metafile dans le presse papier et le sauve vers un fichier
    If OpenClipboard(0) Then
        If IsClipboardFormatAvailable(&H3) = 0 Then MsgBox " pas de meta dans le clip": Exit Function
        hGlobal = GetClipboardData(&H3) ' VF_METAFILE = 0x3 (format WMF)soit au format Hex "&H3"
        hMeta = GlobalLock(hGlobal): GlobalUnlock hGlobal
        RtlMoveMemory hMeta, hMeta + 12, Len(hMeta)
        If hMeta <> 0 Then hCopy = CopyMetaFileA(hMeta, cheminX) ' Copier l'EMF dans un fichier
           If hCopy <> 0 Then DeleteMetaFile hCopy
    End If
    CloseClipboard ' Fermer le presse-papiers
    copyObjToWmfFile2 = cheminX
End Function
Sub ListClipboardDisponibleFormats()
    'patricktoulon
    Dim formatID As Long
    OpenClipboard 0
    formatID = EnumClipboardFormats(0)

    Do While formatID <> 0
        Debug.Print "Format disponible : " & Hex(formatID)
        formatID = EnumClipboardFormats(formatID)
    Loop
    CloseClipboard
End Sub
voila
patrick
 
Dernière édition:
Bonjour jurassic pork
bon ben on va travailler la dessus aussi alors

edit :
a oui mais sur un webbrowser ce qui change la donne car pour certains le webbrowser c'est mort
en tout cas ce qui ont IE bloqué ou supprimé par la mise a jour W10 prévu a cet effet
 
Dernière édition:
edit :
a oui mais sur un webbrowser ce qui change la donne car pour certains le webbrowser c'est mort
en tout cas ce qui ont IE bloqué ou supprimé par la mise a jour W10 prévu a cet effet
Hello Patrick,
le IE bloqué çà c'est vrai mais pas le contrôle activeX webBrowser qui reste disponible. Il fonctionne chez moi sous Windows 11.
A noter aussi que l'on peut insérer une image svg dans une feuille d'un classeur qu'à partir d'Excel 2016. A vérifier avec ton Excel 2013 si tu arrives à visualiser un svg dans un contrôle activeX webBrowser. Ne pas oublier qu'il peut aussi afficher bien d'autres formats d'image en particulier le Gif Animé. Par contre il n'affiche pas les wmf.
ami calmant, J.P
 
Dernière édition:
re
Bonjour jurrasic pork
oui je sais
Attention certains qui ont W10 ont eu une mise a jour qui a carrément supprimé IE et le webbrowser est basé sur la shockwave.dll
les autres ont eu la 2d mise a jour moins dure qui consiste simplement à renvoyer ie vers edge

après pour le reste je sais je m'en suis servi pendant longtemps envoie un svg que je teste

edit : non je viens de tester je ne peux pas utiliser de svg dans une feuille
 
Dernière édition:
re
Bonjour jurrasic pork
oui je sais
Attention certains qui ont W10 ont eu une mise a jour qui a carrément supprimé IE et le webbrowser est basé sur la shockwave.dll
les autres ont eu la 2d mise a jour moins dure qui consiste simplement à renvoyer ie vers edge.

après pour le reste je sais je m'en suis servi pendant longtemps envoie un svg que je teste
Prend le Emule_mascot du post #37 à tester avec le activeX Webbrowser. Pour le charger faire comme avec un gif animé
Voici ce que cela donne avec un formulaire de visualisation d'images par WebBrowser avec formulaire redimensionnable qui utilise un système d'ancrage pour les contrôles :
VisuImgWB.gif
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
46
Affichages
2 K
Réponses
7
Affichages
531
Réponses
7
Affichages
1 K
Retour