peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012
-
14 juin 2004 à 10:18
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013
-
14 juin 2004 à 17:21
Bonjour, j'essai de dessiner avec l'API.
Dans un ActiveX, comment utiliser la fonction Rectangle ?
Je crée une sub :
Public Sub DrawRectangle(ByRef hDC As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal BackColor As Long)
Rectangle hDC, X1, Y1, X1 + X2, Y1 + Y2
end sub
mais comment utiliser les style et couleur avec le hDC... cela permettrait ainsi d'utiliser la même sub pour dessiner sur le Usercontrol et pour imprimer sur Printer ! non ?
Dans la déclaration j'ai essayé de passe "byref obj as Object" mais je ne peux passé le UserControl !
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 14 juin 2004 à 11:44
Ok, c'est ce que j'ai fait lors de l'appel de la fonction
Voici la fonction :
Public Sub DrawRectangle(ByRef hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal BackColor As Long)
'
Dim hbrush As Long
Dim holdbrush As Long
Dim retval As Long
Dim r As Long
Dim G As Long
Dim B As Long
Dim hPen As Long
Dim hOldPen As Long
Dim lColor As Long
Call OleTranslateColor(BackColor, 0, lColor)
r = (lColor And &HFF&)
G = (lColor And &HFF00&) \ &H100&
B = (lColor And &HFF0000) \ &H10000
Mais alors.... je lis que l'API est mieux pour dessiner... Trouvez-vous que toute ces lignes pour dessiner un rectangle de couleur est plus rapide que la fonction VB line ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 juin 2004 à 11:59
he He, les fonctions de l'API sont plus rapide si on les appelle en C, mais pas forcément en VB ! Niveau nombre de ligne, c'est clair qu'en VB, la syntaxe est plus compacte, en rapidité, c'est du kif-kif, en fait, les API sont plus rapide lorsqu'il s'gait de faire de grosses opérations, du style une opération sur chaque pixel d'une image : de l'ordre de 20 à 30x plus rapide entre GetDIBits et la fonction VB Point !
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 14 juin 2004 à 13:15
Hum..
Cependant, on perd aussi en précision de dessin. Je m'explique ; Sur un Usercontrol, je dessine avec "Line" en ScaleMode Twips... En API, je dois utiliser par exemple "Screen.TwipsPerPixelX" pour transformer les coordinnées. De là, la précision du dessin n'est plus bonne avec pixel On voit vite cela si je dessine des rectangles pour faire un damier par exemple. En Twips cela reste impeccable.
Connaissez vous peut être une piste qui permet de conserver en Pixel une précision de dessin ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 juin 2004 à 13:30
Je ne vois pas trop comment ca se fait que tu perds de la précisions lorsque tu passe en pixel vu que le pixel est la plus petite unité de dessin que peut afficher l'écran...
En tout cas, je ne vois pas comment résoudre ce problème avec les API : elles n'acceptent que des coordonnées en pixels !
Fait bien attention aux arondis avec TwipsPerPixelX... peut-être que ca vient de là.
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 14 juin 2004 à 13:46
C'est vrai mais voyez par exemple ce code utilisant la fonction citée plus haut:
Private Sub Form_Load()
Dim i As Long
Dim j As Long
'
With Form1
.ScaleMode = vbTwips
.AutoRedraw = True
End With
'
For i = 0 To Width Step 1000
For j = 0 To Height Step 1000
DrawRectangle Form1.hdc, i, j, 990, 990
Next
Next
End Sub
Cela fait un damier irrégulier.
Devrais-je donc alors tout repasser mon ActiveX (fait en Twips) en Pixel pour ne plus avoir de souci de précision ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 juin 2004 à 14:59
Et bien je te conseille de tester un petit bout de code en pixel pour voir ce que ca donne, et si ca donne un résultat comme il faut, à ce moment là, oui, il faudrait tout passer en pixel !
-
DarK Sidious
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 14 juin 2004 à 17:15
Voilà, j'ai suivi ton conseil et j'ai tout repassé en Pixels et cela fonctionne très bien.
Je peux donc maintenant envoyer aisément vers le hDC de la form ou du Printer.. (Ton site me donnera aussi un coup de pouce pour ce qui est des Printers.
Merci :)
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 juin 2004 à 17:21
Et bien voilà, avec un peu de persévérance, tu y est arrivé ;-) C'est vrai que l'avantage des API comparé aux fonctions de VB, c'est qu'on peut tracer dans n'importe quel contexte !