Dessiner une ligne avec bordures avec GDI+

cs_youyou40
Messages postés
65
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2022
- 26 avril 2022 à 15:45
cs_youyou40
Messages postés
65
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2022
- 28 avril 2022 à 11:56
Bonjour,

Est-il possible de dessiner une ligne à deux couleurs (une pour le remplissage et l'autre pour la bordure) avec GDI+ ?
Je n'ai pas trouvé le moyen de le faire bien que j'ai parcouru les fonctions concernant les Graphics, les Paths, les Brush, les Pen etc...

Merci d'avance pour votre aide.--

7 réponses

JeuDuTaquin
Messages postés
223
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
27 mai 2022
7
26 avril 2022 à 23:38
Salut Youyou...

As-tu de bonnes raisons pour utiliser GDI+ afin de dessiner une simple ligne de largeur différente ?

Si c'est une ligne dans une form ou une picturebox, une fonction GDI déjà optimisée existe.

(déactiver l'auto-refresh pour accélérer l'affichage)

Sinon, utilise l'objet Line en array pour pouvoir afficher les lignes en priorité d'affichage en premier plan.

On peut sûrement le faire, mais le GDI+ n'as pas été conçu pour cela.
0
cs_youyou40
Messages postés
65
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2022

27 avril 2022 à 00:00
Merci pour ta réponse.
Si on peut le faire avec GDI c'est très bien mais, désolé, je n'ai pas compris ce que tu proposes....

--
0
JeuDuTaquin
Messages postés
223
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
27 mai 2022
7
Modifié le 27 avril 2022 à 01:36
Salut,
Ouvre un projet VB avec form vide.
Ajoute une PictureBox (Picture1) et un bouton (Command1).
Copie le code dans le code de la form.
Démarrage sur la form principale...

Private Sub Command1_Click()
Dim a as integer
Dim x,y as Long

    Picture1.DrawStyle = 0
For a = 0 To 10
    x = Picture1.Width * Rnd * Screen.TwipsPerPixelX
    y = Picture1.Height * Rnd * Screen.TwipsPerPixelY
    
     Picture1.DrawWidth = 4
    Picture1.Line (0, 0)-(x, y), vbBlue
     Picture1.DrawWidth = 2
    Picture1.Line (0, 0)-(x, y), vbRed
Next
End Sub


0
JeuDuTaquin
Messages postés
223
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
27 mai 2022
7
27 avril 2022 à 02:38
Pour une fenêtre flottante en mouvement sur l'image:



Ajouter la PictureBox Picture2, puis le code suivant...


Private Sub Form_Load()
Picture1.AutoRedraw = True
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture2.Visible = False
End Sub


Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim a as integer

Picture2.Visible = True
Picture2.Cls
Picture2.DrawWidth = 1
Picture2.PSet (170, 70), Picture2.BackColor
Picture2.Print "Image !!!"

For a = 1 To 2
  Picture2.DrawWidth = 4 / a
    Picture2.Line (50, 50)-(Picture2.Width - 50, 50), IIf(a = 1, vbBlue, 0) + IIf(a = 2, vbYellow, 0)
    Picture2.Line -(Picture2.Width - 50, Picture2.Height - 50), IIf(a = 1, vbBlue, 0) + IIf(a = 2, vbYellow, 0)
    Picture2.Line -(50, Picture2.Height - 50), IIf(a = 1, vbBlue, 0) + IIf(a = 2, vbYellow, 0)
    Picture2.Line -(50, 50), IIf(a = 1, vbBlue, 0) + IIf(a = 2, vbYellow, 0)
Next a
    
Picture2.Move X + Picture1.Left, Y + Picture1.Top

End Sub

0

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

Posez votre question
cs_youyou40
Messages postés
65
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2022

27 avril 2022 à 10:48
Merci beaucoup pour ta réponse détaillée et claire mais dessiner des lignes et les manipuler avec les fonctions intégrées de VB ou avec les API de GDI je sais le faire.

J'ai déjà contourné le problème comme tu le fais en traçant deux fois la même ligne avec une largeur et une couleur différente pour donner l'impression d'une ligne avec bordure mais je voulais savoir si il existait une façon de le faire (avec VB, GDI ou GDI+) qui ne faisait tracer la ligne qu'une seule fois (mon programme est amené à dessiner des milliers voire dizaines de milliers de lignes alors les doubler toutes ne me plait pas trop....)
0
JeuDuTaquin
Messages postés
223
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
27 mai 2022
7
Modifié le 28 avril 2022 à 01:04
Salut Youyou,

La solution purement VB est problématique par sa lenteur qui t’obligera à zoner ton vectoriel.

Le GDI et GDI+ ne sont pas une solution viable pour ce type de dessins.
Ces dépendances systèmes sont clairement orientées traitement d'images bitmap, et la seule solution serait de fusionner les vectoriels de plusieurs couches.
Mais, cela serait gourmand en ressources et contre-intuitif.

Je te propose donc de t’orienter vers des solutions intégrées au traitement vectoriel, Direct2D et DirectX.

DirectX 11 pourra utiliser au mieux les ressources de ta carte graphique, tout en contournant les lenteurs de VB6.

Le traitement vectoriel en 3D sera calculé par la carte, et ainsi, contournera le GDI ou le GDI+ trop ancien pour tirer parti des cartes 3D avec calculateurs intégrés.

L'intègration de DX11 est plutôt bien documentée, même si le C++ reste la norme.

Il sera possible d'importer directement les fichiers vectoriels (DXF, AI d'Illustrator ou OBJ 2D) en 3D, et doubler l'objet avec un tracé plus petit et de couleur différente avec de légères modifications, puis sauvegardée dans un fichier propriétaire plus rapide à charger.

Va voir sur les exemple DirectX 10 ou 11 en VB6, tu trouveras peut-être ton bonheur.
0
cs_youyou40
Messages postés
65
Date d'inscription
lundi 20 décembre 2004
Statut
Membre
Dernière intervention
28 avril 2022

28 avril 2022 à 11:56
Salut JeuDuTaquin,
une fois de plus merci beaucoup pour ta réponse.

C'est ce que je pensais un peu, ni VB, ni GDI, ni GDI+ ne sont adaptés à ce genre de chose...
Effectivement le traitement est très lent (trois fois plus lent avec GDI+ qu'avec GDI d'ailleurs....) alors en doublant les polylignes pour avoir une bordure, ben le temps double encore.

Je vais donc, suivant tes conseils, aller chercher du côté de DirectX.

Merci encore!

--
0