Récupérer la largeur et la hauteur d'une image BitMap chargée dans un contrôle i [Résolu]

Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
- - Dernière réponse : ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 4 avril 2012 à 10:02
Bonjour à tous,

Une nouvelle question me taquine l'esprit et j'aimerais en savoir plus...

Dans une feuille Excel j'ai un contrôle image (Contrôle ActiveX). C'est un objet de type OLEObject. Je charge une image BitMap dans ce contrôle et j'aimerais savoir quels en sont la largeur et la hauteur de l'image qui est chargée.

J'ai fait des recherches sur le net et malgré plusieurs questions sur le sujet, je n'ai pas trouvé beaucoup de réponses.

Je suis tout de même parvenu à trouver une solution qui fonctionne bien. Mais le code employé ne me parais pas le plus adapté à mon cas de figure. C'est pourquoi je préfère demander ici, s'il existe une autre méthode plus en adéquation.

Je précise que je ne charge par une image dans un contrôle image pour en obtenir la largeur et la hauteur. Je charge l'image dans le contrôle pour la suite de mon projet. Et je me dis que si l'image doit être chargée, alors autant en profiter pour en extraire les données que je veux. Or actuellement le code que j'emploie ne passe pas du tout par le contrôle image mais directement par la ré-ouverture du fichier via Open For Binary Access.

Voici le code qui génère le contrôle image :

'=  =========================================================================================================================
Dim Contrôle_Image1 As OLEObject
'=================================================================
'Création, insertion, placement et dimensionnement d'un object sur la feuille (Contrôle image dans cet exemple)
'Set Contrôle_Image1 ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
DisplayAsIcon:=False, Left:=210, Top:=124.5, Width:=123, Height:=49.5)

'=============================================================
'On contrôle ensuite ici l'ensemble des propriétés de l'objet sur lequelles ont souhaite agir
'Contrôle_Image1.Name "Image1"
Contrôle_Image1.Left = Range("R7").Left
Contrôle_Image1.Top = Range("R7").Top
Contrôle_Image1.Width = Range("R7:T5").Width
Contrôle_Image1.Height = Range("R7:T15").Height
Contrôle_Image1.Placement = xlMoveAndSize
Contrôle_Image1.PrintObject = True
Contrôle_Image1.Object.Picture = LoadPicture(Fichier_Image)
Contrôle_Image1.Object.PictureAlignment = 2
Contrôle_Image1.Object.PictureSizeMode = 3
Contrôle_Image1.Object.BackStyle = 0
Contrôle_Image1.Object.SpecialEffect = 6
'========================================================================================================================== 



Voici le code que j'ai trouvé et qui permet d'obtenir la largeur et la hauteur :

Private Type BITMAPFILEHEADER
    bfType As Integer
    bfSize As Long
    bfReserved1 As Integer
    bfReserved2 As Integer
    bfOffBits As Long
End Type

Private Type BITMAPINFOHEADER
    biSize As Long
    biWidth As Long               '<--------------
    biHeight As Long              '<--------------
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type

Public Sub test()
Open Fichier_Image For Binary Access Read Write Lock Write As #1
Dim BMPFileHeader As BITMAPFILEHEADER
Dim BMPInfoHeader As BITMAPINFOHEADER
 
    Get #1, 1, BMPFileHeader
    Get #1, , BMPInfoHeader
Largeur    = BMPInfoHeader.biWidth
Hauteur = BMPInfoHeader.biHeight
End Sub



Comment puis-je améliorer ce code pour le rendre le plus simple simple possible ?

Il me semble qu'il est possible d'utiliser le type suivant :

Type BITMAP
   bmType As Long
   bmWidth As Long
   bmHeight As Long
   bmWidthBytes As Long
   bmPlanes As Integer
   bmBitsPixel As Integer
   bmBits As Long
   End Type



Puis d'obtenir la largeur et la hauteur avec :

Dim bmAPI As BITMAP
With bmAPI
   Largeur = .bmWidth:
   Hauteur = .bmHeight:
End With


Ce code est simple, mais je ne parviens pas à l'utiliser dans mon cas de figure.


Vos idées sont les bienvenues.

Bien cordialement,

André
Afficher la suite 

20/50 réponses

Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
0
Merci
euuuuh finalement j'ai craqué...Je ne pouvais pas aller me coucher sans vérifier un détail.

Je n'ai pas résisté à vérifier si les couleurs RGB des pixels étaient correctes. Ma référence pour comparaison est un logiciel de traitement d'image. Et bien j'ai eu la bonne surprise de constater que pour une même coordonnée (X; Y) d'un pixel j'obtiens les bon couples RGB. Ça fonctionne bien.

C'est nikel dis donc !!!


Du coup ça soulève la aussi une petite réflexion de ma part. Le pixel de coordonnée (0;0) se situe en haut à gauche d'une image. C'est sans doute une norme je pense. Mais est-il possible de faire en sorte que le pixel de coordonnée (0;0) se trouve en bas à gauche ?
C'est juste histoire de se retrouver dans une config axe X/Y classique. Si c'est possible, ET si c'est super simple à mettre en œuvre alors je suis intéressé. Si par contre ça nécessite des lignes de codes supplémentaires compliquées pour assurer la transformation, on oublie. C'est juste une préférence et non une contrainte.

Mais si je peux avoir le le luxe de choisir le zéro, je suis preneur quand même^^


Allez cette fois-ci je vais vraiment me coucher. J'ai fait le tour des questions qui m'interloquaient pour ce soir...

Bonne nuit
Commenter la réponse de SERIEUXETCOOL
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Du coup j'ai encore un doute !
J'ai bien compris qu'André voulait des pixels vu que les propriétés des images des classes Shapes
et Pictures que j'utilise me renvoient directement des points !
N'est-ce pas le cas pour un OLEObject ?

Sinon si c'est pareil, il y a bien plus simple - en tout cas dans la version 2003 - pour récupérer
des pixels, pas besoin d'appeler une Lib externe ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Bonjour, MarcPL,
cela fait trois fois que tu le dis !
Montre donc comment.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
En espérant, MarcPL que :
- ta "soluce" ne soit pas simplement d'afficher en autosize pour constater les dimensions
- que si c'est celà : tu as bien prévu de ne pas compter les bordures (ou de les supprimer)
- que ta "soluce" puisse ensuite permettre d'extraire les pixels (à elle seule), sans avoir à passer par une solution "externe" et en tenant compte de tous les cas de figure (de configuration d'écran)
etc...
Mais comme tu insistes beaucoup : tu as réveillé ma curiosité ===>> montre.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Salut ucfoutu ! Cela fait des années que j'utilise "mon" calcul de pixels pour Shapes ou Pictures.
Cela ne marchera pour un OLEObject que si ses propriétés Height & Width renvoient aussi des points,
est-ce bien le cas ? (je ne ferais pas le test car cela fait aussi des années que je les ai bannis !)

D'où mes premières questions à André quant aux difficultés rencontrées ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
0
Merci
Salut tout le monde,

Ucfoutu :

Ta demande est étonnante, André, car elle consisterait à vouloir modifier toute la philosophie d'une matrice.


Oups, en lisant ces 2 lignes je me suis sentit con j'avoue. J'ai pas percuté de suite que si l'on commençait avec le coin supérieur gauche...C'était simplement que l'on parcourait une matrice. C'est maintenant évident.
Il était tard hier soir, j'étais fatigué

Du coup je pense avoir compris le truc pour parcourir la matrice dans l'ordre que je veux. C'est réglé. Dsl pour cette question "bête", et du coup merci pour cette réponse claire et "parlante" en plus


Ucfoutu :

Juste pour faire coincider avec la philosophie de ta représentation en axes orientés ?


Oui en effet, c'était bien pour cela uniquement. Donc rien de méchant dans tous les cas. Mais au moins j'ai pris conscience du truc. Donc c'est l'essentiel.


MarcPL :

J'ai bien compris qu'André voulait des pixels vu que les propriétés des images des classes Shapes
et Pictures que j'utilise me renvoient directement des points !
N'est-ce pas le cas pour un OLEObject ?

Sinon si c'est pareil, il y a bien plus simple - en tout cas dans la version 2003 - pour récupérer
des pixels, pas besoin d'appeler une Lib externe ...


Il y peut être plus simple pour récupérer la valeur Largeur et Hauteur d'une image. Si vous revenez au tout premier post de cette discussion, j'ai posté moi même une toute autre solution qui peut paraitre plus simple elle aussi.
Néanmoins, celle d'Ucfoutu est plus en accord avec la suite de mon projet je pense. Disons que certains éléments qu'il charge me seront par la suite nécessaires. Donc autant charger certains de ces éléments de suite plutôt que de charger pleins de choses qui me serviront ponctuellement.

MarcPL si tu as une autre solution qui peut fonctionner, il me semble utile que tu la propose maintenant. Elle m’intéressera certainement, et intéressera probablement d'autres personnes qui passeront par la. Donc autant profiter de l'instant pour enrichir cette discussion. C'est pile l'objet de ce post


Bon je pense que cette discussion va bientôt toucher à sa fin. Néanmoins il reste encore un détail qui n'a pas été traité. Il concerne mes posts de ce matin à 00H35 et à 1H22. Sur le fait que le code proposé par Ucfoutu pour récupérer la Largeur et la Hauteur ne semble pas fonctionner correctement pour toutes les photos.

Quelqu'un pourrait il me confirmer quelles modifications sont à faire pour le rendre juste ???

André
Commenter la réponse de SERIEUXETCOOL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
1) avant même la conversion, il faut savoir ce que l'on va convertir. Comment comptes-tu extraire ces dimensions (en quelques unités que ce soient) sans le subterfuge/ersatz dont j'ai parlé .
2) toute unité graphique est transposable en toute autre unité graphique. Lorsque l'unité finale dépend (et c'est le cas des pixels) de la configuration de l'écran : quelle méthode utilises-tu pour déterminer le nombre de twpis par pixel (tant en hauteur qu'en largeur) ? Si tu utilises la valeur 15 ===>> tu es dans le vrai dans la plupart des cas, mais vas tout droit dans le mur dans d'autres.
Mais arrête d'en discuter par allusion et montre ton code, de sorte à ce que l'on puisse y voir autrement que par "il existe une solution simple", hein.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
0
Merci
Ralala...la franchise d'Ucfoutu dans toute sa splendeur


MarcPL, ce qu'Ucfoutu essaie de dire c'est que si la méthode dont tu parles est simple, elle peut probablement être exposée ici en quelques lignes de code.

Les personnes qui passeront par ici plus tard seront un peu frustrées de lire qu'il existe d'autres choses...qui n'ont pas été exposées ici alors que c'est le but du post.

Rien de plus.
Commenter la réponse de SERIEUXETCOOL
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Comme je ne vais plus être disponible pendant quelques heures,
n'ayant toujours pas de réponse sur l'unité de renvoi des propriétés Height & Witdh d'un OLEObject,
dans le cas où ce sont bien des points comme pour des Shapes & Pictures,
pour rappel renvoyant à mon premier post "surtout au moment de leur insertion",
voici mon code (version 2003) :
                     R = ActiveWorkbook.WebOptions.PixelsPerInch / 72
                xPixel = .Width * R
                yPixel = .Height * R


En fait, j'attends juste que l'on réponde à mes questions avant d'exposer une solution
sachant les flagrantes différences entre des versions d'Excel ou des objets, rien de plus ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
A MarcPL :
As-tu lu ce qu'est la propriété que tu utilises ?
Cette propriété renvoie ou définit la densité (exprimée en pixels par pouce) des images de graphismes et des cellules de tableau d'une page Web. La plage de paramètres est généralement comprise entre 19 et 480 pixels par pouce et les paramètres courants des tailles d'écran répandues sont 72, 96 et 120 pixels par pouce. Le paramètre par défaut est 96 pixels par pouce. Type de données Long en lecture-écriture.

Regarde donc ce que j'ai souligné
Et ton 72 : il est bon sur ta machine et pas forcément sur celle du voisin
Bref...

Revenons à nos moutons :
André :
Je pense tout simplement que cela vient de l'entier, qui tronque.
Supprime-le (pas d'importance puisque le type Long choisi "corrigera" :
ici :

.....
....

 pixels_width = Application.CentimetersToPoints(toto.Width / 1000) * 20 / TwPerPix("X")
    pixels_height = Application.CentimetersToPoints(toto.Height / 1000) * 20 / TwPerPix("Y")
...
...


Je n'ai chez moi aucune image qui tombe dans le cas de figure que tu dénonces. Essaye avec celles que tu as trouvées chez toi en défaut.
Et fais-moi savoir.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Bon alors on doit être vraiment chanceux de l'utiliser depuis une p'tite dizaine d'année
sans jamais tomber sur aucun PC posant problème ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Juste pour ton info : je suis en ce moment sur un écran de 96 DPI et mon voisin (ah le chanceux) sur un écran de 120 dpi
Je te conseille de lire ceci, entre autres :
Tapez le texte de l'url ici.
puis de corriger tes applis (pour ne pas avoir de surprises inattendues)
Tu sais maintenant le faire, hein
Et ce n'est pas pour m'amuser, que j'ai fait tous ces petits calculs (y compris ceux de la détermination du nombre de twips par pixel horizontalement et verticalement).
Voilà ==>> tu sais maintenant tout.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Si vous regardez l'aide par exemple de InchesToPoints, vous y verz la définition d'un point :

[i]unité de mesure qui fait référence à la hauteur d'un caractère imprimé.
Un point est égal à 1/72e de pouce./i

Pas besoin de cherchez alors midi à quatorze heures ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Et avec ça ? tu es toujours en unités physiques "métriques" !
Et tu vas maintenant passer des pouces (par multiplication) aux pixels comment ?
(c'est là qu'interviendront nécessairement des données de ton matériel !)
Pourquoi crois-tu que Windows calcule d'abord en unités Himetric (millièmes de centimètre) ? Pour se rendre d'abord indépendant avant de "transposer" en twips puis en pixels en fonction du nombre de twips par pixel (twipsperpixelX en largeur et TwipsperpixelY en hauteur). Presque tous les matériels sont maintenant en 15 twips par pixel en hauteur et autant en largeur. Presque tous ne veut pas dire tous, d'une part, et, d'autre part ce nombre pourrait ne pas être le même en largeur et en hauteur.

Et tu reprochais quoi ? De déclarer et utiliser StdPicture ? Mais dis-voir : ton code (celui montré) fait forcément usage d'une déclaration, lui également ! on ne la voit pas dans ton code).
Mais je vais m'amuser avec, tiens ==>> qu'affiche ceci chez roi :
Set machin = Application.DefaultWebOptions
MsgBox machin.PixelsPerInch

(car si 72, tu n'es pas vraiment riche en matériel )

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
0
Merci
Bonsoir,

Ucfoutu :

Revenons à nos moutons :
André :
Je pense tout simplement que cela vient de l'entier, qui tronque.
Supprime-le (pas d'importance puisque le type Long choisi "corrigera"


C'est en effet la méthode numéro 2 que je proposais dans mon message en date du samedi 31 mars 2012 à 01:22:43. Tu as du passer outre sans doute.

Je n'ai donc pas besoin de tester cette méthode car je l'avais déjà fait . Elle résout en effet très bien le problème.

Pour rappel, la méthode 1 que je proposais visait à remplacer "Int" par "CInt" qui fonctionnait aussi bien.

...
Set toto = LoadPicture("d:\bateau.bmp")
    pixels_width = CInt(Application.CentimetersToPoints(toto.Width / 1000) * 20 / TwPerPix("X"))
    pixels_height = CInt(Application.CentimetersToPoints(toto.Height / 1000) * 20 / TwPerPix("Y"))
    hdc = CreateCompatibleDC(0)
...


Je suis donc ton conseil Ucfoutu et applique ta petite correction qui correspond à la méthode 1.


Les réponses apportées à ce post me satisfont pleinement. Sujet résolu pour ma part.

Merci à vous deux principalement (Ucfoutu et MarcPL). Et merci aux autres aussi.


Bien cordialement,

André
Commenter la réponse de SERIEUXETCOOL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
A MarcPL,

Tu as à la fois raison et tort (et moi également).
Je n'avais pas "tilté" sur la valeur 72, que je voyais à tort comme 72 DPI alors que ce n'était finalement que le 20ème de 1440 (il y a 1440 twips dans un pouce)
Ta méthode est donc juste, mais je lui préfère la mienne. Pourquoi ? Parce qu'elle est totalement indépendante de fantaisies possibles de l'utilisateur.
La propriété PixelsPerInch est en effet en lecture/écriture (pour permettre à l'utilisateur certains ajustements, s'il le souhaite). Confère :
La propriété ScreenSize vous permet de définir la taille d'écran optimale pour les navigateurs Web cible.

Il suffit alors qu'il s'y amuse et voyons le résultat ===>>>
Fais ce petit test sur un userform :
Private Sub CommandButton1_Click()
  Set machin = Application.DefaultWebOptions
  machin.PixelsPerInch = 110 ' <<<<<===== volontairement fantaisiste
  MsgBox machin.PixelsPerInch
End Sub

Private Sub UserForm_Click()
  Set machin = Application.DefaultWebOptions
  MsgBox machin.PixelsPerInch
End Sub

Clique sur le bouton de commande ===>> constate
Clique maintenant sur le Userform ===>> cette valeur est là (donc en dehors de la procédure)
Et tous les calculs seront alors faux.




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Et c'est bien pire que cela, encore !
Je viens d'ouvrir un second classeur (scénario toujours possible) ===>> la valeur arbitraire de l'utilisateur est là !
Ouille !
Mais ce n'est pas fini ===>> Je ferme TOUS les classeurs
J'en ouvre un nouveau (seul) ===>> la valeur arbitraire est là !
Achtung, donc, hein

Vérifie donc et constate.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Je commençais à désespérer après ton avant-dernier message,
je n'avais plus de manière polie après une soirée bien arrosée pour t'exposer le nombre magique 72
(définition de l'aide pourtant claire - Un point est égal à 1/72e de pouce. -
 magique car il peut servir aussi dans au moins un autre cas qui m'a rapporté une incompréhension semblable)
quand enfin ton dernier message m'a bien "réconforté" je l'avoue.

Petit test après le tien, remet l'Application.DefaultWebOptions.PixelPerInch comme à l'origine (96 ou 120)
puis regarde ce que donne ActiveWorkbook.WebOptions.PixelsPerInch ...

Ferme complètement Excel, relance-le et regarde directement ce que donne de nouveau la ligne précédente ...
Edifiant, non ?!   Je te l'accorde, utilisant cette méthode depuis une p'tite dizaine d'année,
par bonheur je n'ai jamais été confronté aux fantaisies d'un utilisateur
car heureusement cette méthode PixelsPerInch est peu ou prou usitée ...

Quoiqu'il en soit, il y a bien une méthode simple sans appel externe !

Je ne voulais pas trop m'avancer à balancer mon code car André ne parlait pas de Shapes ou Pictures
mais bien d'OLEObjects nous ayant occasionnés bien des galères il y a presque 10 ans et,
après avoir consulter le code généré par l'enregistreur de macros, constatant sa préférence
envers les Shapes & Pictures, j'ai fini par définitivement bannir ces OLEObjects
autant que faire ce peut ...   D'où mes questions préventives, ...   Affaire classée !

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
En fait c'était l'avant avant dernier message car j'ai commencé à ouvrir ma réponse avant ton dernier message ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Je te l'accorde, utilisant cette méthode depuis une p'tite dizaine d'année,
par bonheur je n'ai jamais été confronté aux fantaisies d'un utilisateur
car heureusement cette méthode PixelsPerInch est peu ou prou usitée


Chanceux, oui car :
- par défaut (si on ne l'a jamais réglée autrement) cette propriété est à 96 DPI (ce qui n'est pas forcément le cas d'un écran)
- Il n'y a pas que depuis Excel, que l'on peut paramétrer.
Je n'ai pas encore réussi à trouver d'où on pouvait le faire sous XP, mais la chose est réalisable facilement depuis Vista, par exemple :
Lis ceci :
Tapez le texte de l'url ici.
Et l'on voit bien que l'utilisateur peut définir ce qui lui convient le mieux, non par fantaisie, mais par confort.
Et remettre à sa valeur par défaut (96) ? Encore faudrait-il qu'elle corresponde, ce qui n'est pas forcément le cas.
Et donc : mettre en mémoire la bonne valeur ? Mais alors : pour ce faire, il va falloir la déterminer à l'aide des fonctions de l'Api de Windows (comme montré) ! On tourne donc en rond sans pouvoir y échapper, depuis VBA. Ce n'est pas le cas de VB6 qui offre nativement les propriétés Scalemode, TwipsperpixelX et TwipsperpixelY ainsi que les méthodes ScaleX et ScaleY, qui permettent toutes ces conversions sans passer par l'utilisation de fonctions de l'Api de Windows


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu