SetPixel place mal le pixel

Signaler
Messages postés
26
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
15 octobre 2007
-
Messages postés
26
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
15 octobre 2007
-
Bonjour à tous,

voilà, je développe une appli sous vba depuis excel.
Mon problème se situe au niveau d'une Userform (équivalent de la form), sur laquelle je veux dessiner (en gros, pour faire simple).

J'utilise donc l'api setpixel, mais il ne me place pas le pixel où il faut dans ma Useform.
En fait, pour voir réellement ce qui se passe, j'utilise directement l'évènement MouseDown de la form, et je fait un setpixel avec les coordonnées X et Y retournée via le clic. Jusque là, rien d'extraordinaire, sauf que le pixel n'est pas où il faut.
Si je clique au coin en haut à gauche, il est où il faut. Mais plus je m'éloigne (dans la form) vers la droite et/ou vers le bas, plus le pixel est créé avec un décalage " retard" qui s'accentue.

Pax exemple, ma form fait 100x100 pixels.
1. Je fait setpixel 0,0 => il me le met en 0,0
2. Je fait setpixel 10,0 => il me le met en 8,0
3. Je fait setpixel 20,0 => il me le met en 15,0
4. Je fait setpixel 50,0 => il me le met en 25,0
5. Je fait setpixel 0,10 => il me le met en 0,8
6. Je fait setpixel 0,30 => il me le met en 0,15
7 Je fait setpixel 100,100 => il me le met en 560,560

Vous voyez le truc koi (les valeur, je l'ai ai mises au pif, histoire de).

Peut etre une piste avec TwipsPerPixelY, mais je ne sais ni l'utiliser, ni à quoi ça sert.

Vous seriez super sympas de m'aider.
Merci à tous.

12 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
salut,
modifie ton scalemode.
(ps : je change ta rubrique, tu es en VBA!)
++
Messages postés
26
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
15 octobre 2007

Merci, mais cette fonction n'existe pas en vba.
Peut etre y a t-il un api?
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
Declare Function SetPixelV Lib "gdi32" Alias "SetPixelV" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Messages postés
26
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
15 octobre 2007

J'ai déjà essayé setpixel, ça change rien.

En fait, je me retrouve exactement avec un décalage de rapport 0.75 (tout rond)
Quand je fait :
Xs = Xs/0.75
Ys=Ys/0.75
Le point est bien positionné.

Mais je ne sais pas comment trouver automatiquement ce rapport (sur une autre machine, autre résolution, ou autre, ce rapprot doit varier).

J'ai trouvé l'équivalent de TwipsPerPixelX et Y, qui me retournent respectivement 15.
Mai je ne sais pas koi faire.

J'ai la tête qui fume là, il faut que je m'en sorte.
Encore merci .
Messages postés
26
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
15 octobre 2007

je viens de constateur autre chose,

j'ai continuer mon rpo normalement, il dessine beaucoup de points en fait, et en attendant, j'ai fait
Setpixel (hdc, X/0.75 , Y/0.75, vbblue)

et là, quand une zone est recouverte (pleine de pixels bleus), un cadrillage assez petit mais régulier apparait
Bizarre, mais peut etre un indice.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Normal, SetPixel demande des pixels alors que vba te renvoie des twips.

Si tu ne peux pas changer le scalemode de ta fenêtre avec vba, alors change l'unité de mesure des api windows : il me semble que c'est la fonction SetMapMode

_
Avant de poster dans le forum,
prière d'aller lire ceci :
http://www.codes-sources.com/reglement.aspx
<s></s>
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
je ne touche pas à VBA, attend quelqu'un de plus calé.
pour moi c'est ton scalemode. change le pour vbpixels '(3)
je doute qu'il n'y ait pas de scalemode en VBA...
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
salut Dark, on s'est croisé, bon à savoir.....
Messages postés
26
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
15 octobre 2007

Merci de vos réponses,
je vais aller jeter un coup d'oeil sur SetMapMode.

Sinon, j'ai remarqué autre chose. En fait au début, le décalage de 0.75 c'était avec l'évènement MouseDown qui ne servait qu'à tester.
En reprenant le prog normal, donc un X et Y imposé (maform.Heighr=500 et maForm.Weight =500) le point de départ au centre donc X=250 et Y=250, j'ai fait un test pour contater le décalage en faisant :

Const k As Integer = 250
Const Ky As Integer = k
For i = 0 To k
   SetPixel DCIMG, k + i, Ky + i, vbBlue
   SetPixel DCIMG, k + i, Ky - i, vbBlue
   SetPixel DCIMG, k - i, Ky - i, vbBlue
   SetPixel DCIMG, k - i, Ky + i, vbBlue
Next i

Ce qui a pour effet de tracer (normalement) une croix du centre de la form vers les bords.

Et la croix est tracée, chaque pixels les uns contre les autres, ce qui n'aurait pas été le cas avec le test MouseDown. (oui, un rapport de 0.75 provoquait un décalage donc les pixels devaient séloigner de plus en plus avec des "blanc" entre).

Donc a pripori, le premier problème rencontré, tampis de ne pas le résoudre, puisque je ne m'en sert pas). C'est bizarre tout ça quand même!.

Donc maintenant je m'apperçoit juste que le centre de la croix est décalé et que, chose étrange aussi, le croix est vrillées, constatez vous même le résultat avec ce code :

Const k As Integer = 250 + 79  ' +79 pour centrer sur X
Const Ky As Integer = k - 10 '-10 pour centrer sur Y
For i = 0 To k
SetPixel DCIMG, k + i, Ky + i, vbBlue
SetPixel DCIMG, k + i, Ky - i, vbBlue
SetPixel DCIMG, k - i, Ky - i, vbBlue
SetPixel DCIMG, k - i, Ky + i, vbBlue
Next i

http://baouc.ifrance.com/1.jpg 'le résultat

Encore merci de m'aider.
Messages postés
26
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
15 octobre 2007

Bon je viens d'essaye avec SetMapMode, la Userform est bien en pixel, puisque si je la change en Twips, ça trace rien de bon (je suis en dehors de la form).

Pour info, comment, ou avec qui, on connait les valeurs des paramètres des fonction API car à chaque fois, je galère.

Comme par exemple pour SetMapMode
Public Const MM_ANISOTROPIC = 8
Public Const MM_HIENGLISH = 5
Public Const MM_HIMETRIC = 3
Public Const MM_ISOTROPIC = 7
Public Const MM_LOENGLISH = 4
Public Const MM_TEXT = 1
Public Const MM_TWIPS = 6

Le 8, 5,3,7,4,1 et 6 comment on les connait?

Enfin, mon problème reste encore entier.
 
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
il me semble que c'est avec
Declare Function GetSystemMetrics Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

mais si tu es en dehors, c'est peut-être juste un oubli de /Screen.TwipsPerPixelX Y?
Messages postés
26
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
15 octobre 2007

Je me suis débrouillé en ajustant manuellement pour le moment mon centre, sa marche bien, je réessayerais plus tard,
en tout cas merci beaucoup a vous.