SetPixel place mal le pixel

baouc Messages postés 26 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 15 octobre 2007 - 17 juin 2006 à 00:13
baouc Messages postés 26 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 15 octobre 2007 - 18 juin 2006 à 10:57
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

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 juin 2006 à 00:29
salut,
modifie ton scalemode.
(ps : je change ta rubrique, tu es en VBA!)
++
0
baouc Messages postés 26 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 15 octobre 2007
17 juin 2006 à 10:34
Merci, mais cette fonction n'existe pas en vba.
Peut etre y a t-il un api?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 juin 2006 à 12:08
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
0
baouc Messages postés 26 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 15 octobre 2007
17 juin 2006 à 12:36
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 .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
baouc Messages postés 26 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 15 octobre 2007
17 juin 2006 à 12:46
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.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 juin 2006 à 12:49
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>
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 juin 2006 à 12:51
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...
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 juin 2006 à 12:52
salut Dark, on s'est croisé, bon à savoir.....
0
baouc Messages postés 26 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 15 octobre 2007
17 juin 2006 à 13:32
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.
0
baouc Messages postés 26 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 15 octobre 2007
17 juin 2006 à 15:06
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.
 
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 juin 2006 à 15:27
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?
0
baouc Messages postés 26 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 15 octobre 2007
18 juin 2006 à 10:57
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.
0
Rejoignez-nous