API Rectangle hDC

peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012 - 14 juin 2004 à 10:18
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Derniè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 !

Merci de votre aide !

9 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
14 juin 2004 à 10:37
Tu peux accèder directement au hDC de ton usercontrol à l'intérieur de celui-ci en tapant : UserControl.hDC

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Derniè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

hPen = CreatePen(6, 0, RGB(r, G, B))
hbrush = CreateSolidBrush(RGB(r, G, B))
hOldPen = SelectObject(hdc, hPen)
'
holdbrush = SelectObject(hdc, hbrush)
'
retval = Rectangle(hdc, X1, Y1, X2, Y2)
'
retval = SelectObject(hdc, holdbrush)
retval = SelectObject(hdc, hOldPen)
retval = DeleteObject(hbrush)
retval = DeleteObject(hPen)

End Sub

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 ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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 !

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Derniè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 ?
0

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

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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à.

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Derniè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 ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Derniè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 :)
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
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 !

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0
Rejoignez-nous