Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ligne pointillée épaisse

9 réponses
Avatar
gap
Avec VB6, on ne peut pas faire de ligne pointill=E9e de plus de pixel
d'=E9paisseur. Il faut utiliser ExtCreatePen pour y arriver. Je r=E9ussis
=E0 faire =E7a. C'est un Line Method modifi=E9 en fait si je comprends bien.
Maintenant, je voudrais pouvoir d=E9placer une telle ligne, ie.
pointill=E9e et =E9paisse, sans laisser de trace, comme on peut d=E9placer
la souris ou encore une ligne (line control) en modifiant ses
extr=E9mit=E9s x1, y1, x2 et y2.

Merci =E0 l'avance pour l'aide.

Jacquelin Hardy

9 réponses

Avatar
LE TROLL
Bonjour,

En dessinant au pixel, tu peux faire ce que tu
veux...
Pour enlever l'ancienne position, tu peux à chaque
déplacement, remettre dans la couleur initial afin
d'effacer.


--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"gap" a écrit dans le
message de news:

Avec VB6, on ne peut pas faire de ligne pointillée
de plus de pixel
d'épaisseur. Il faut utiliser ExtCreatePen pour y
arriver. Je réussis
à faire ça. C'est un Line Method modifié en fait
si je comprends bien.
Maintenant, je voudrais pouvoir déplacer une telle
ligne, ie.
pointillée et épaisse, sans laisser de trace,
comme on peut déplacer
la souris ou encore une ligne (line control) en
modifiant ses
extrémités x1, y1, x2 et y2.

Merci à l'avance pour l'aide.

Jacquelin Hardy
Avatar
tking
gap a exprimé avec précision :
Avec VB6, on ne peut pas faire de ligne pointillée de plus de pixel
d'épaisseur. Il faut utiliser ExtCreatePen pour y arriver. Je réussis
à faire ça. C'est un Line Method modifié en fait si je comprends bien.
Maintenant, je voudrais pouvoir déplacer une telle ligne, ie.
pointillée et épaisse, sans laisser de trace, comme on peut déplacer
la souris ou encore une ligne (line control) en modifiant ses
extrémités x1, y1, x2 et y2.

Merci à l'avance pour l'aide.

Jacquelin Hardy




Exemple avec line, recuperation des pos de la souris

________________________________________________

Private Declare Function GetCursorPos Lib "USER32" (lpPoint As
PointAPI) As Long

Private Type PointAPI
x As Long
y As Long
End Type

Dim Tampon As PointAPI
________________________________________________



Private Sub Timer1_Timer()

Line1.X1 = Tampon.x * 15
line1.y1 = tampon.y * 15

end sub


_________________________________________________
Avatar
gap
Gap,

ton exemple fonctionne bien, mais c'est fait avec un
LineControl. Je ne peux pas l'appliquer à une ligne créée à partir de
ExtCreatePen. A moins que qqch. ne m'échappe. Peut-être devrais-je
dessiner la ligne pointillée épaisse avec qqch. comme BitBlt ou des
fonctions utilisées pour les sprites. J'sais pas encore !

JH
gap a exprimé avec précision :

> Avec VB6, on ne peut pas faire de ligne pointillée de plus de pixel
> d'épaisseur. Il faut utiliser ExtCreatePen pour y arriver. Je réuss is
> à faire ça. C'est un Line Method modifié en fait si je comprends bien.
> Maintenant, je voudrais pouvoir déplacer une telle ligne, ie.
> pointillée et épaisse, sans laisser de trace, comme on peut dépla cer
> la souris ou encore une ligne (line control) en modifiant ses
> extrémités x1, y1, x2 et y2.

> Merci à l'avance pour l'aide.

> Jacquelin Hardy

Exemple avec line, recuperation des pos de la souris

________________________________________________

Private Declare Function GetCursorPos Lib "USER32" (lpPoint As
PointAPI) As Long

Private Type PointAPI
x As Long
y As Long
End Type

Dim Tampon As PointAPI
________________________________________________

Private Sub Timer1_Timer()

Line1.X1 = Tampon.x * 15
line1.y1 = tampon.y * 15

end sub

_________________________________________________


Avatar
François Picalausa
On Sep 26, 9:28 pm, gap wrote:
Avec VB6, on ne peut pas faire de ligne pointillée de plus de pixel
d'épaisseur. Il faut utiliser ExtCreatePen pour y arriver. Je réussis
à faire ça. C'est un Line Method modifié en fait si je comprends bi en.
Maintenant, je voudrais pouvoir déplacer une telle ligne, ie.
pointillée et épaisse, sans laisser de trace, comme on peut déplacer
la souris ou encore une ligne (line control) en modifiant ses
extrémités x1, y1, x2 et y2.

Merci à l'avance pour l'aide.

Jacquelin Hardy



Hello,

La méthode la plus simple est d'avoir un objet contenant la partie
"fixe" du traçage, et de tracer par dessus l'image, peu importe la
méthode utilisée. Le problème est que le fait de retracer l'entière té
de la zone directement à l'écran présente un problème de
rafraichissement. Voici une implémentation possible:

Option Explicit

Private Type LOGBRUSH
lbStyle As Long
lbColor As Long
lbHatch As Long
End Type

Private Declare Function SelectObject _
Lib "gdi32" _
( _
ByVal hdc As Long, _
ByVal hObject As Long _
) _
As Long
Private Declare Function DeleteObject _
Lib "gdi32" _
( _
ByVal hObject As Long _
) _
As Long

Private Declare Function ExtCreatePen _
Lib "gdi32" _
( _
ByVal dwPenStyle As Long, _
ByVal dwWidth As Long, _
lplb As LOGBRUSH, _
ByVal dwStyleCount As Long, _
lpStyle As Long _
) _
As Long

Private Const BS_SOLID = 0
Private Const PS_ENDCAP_ROUND = &H0
Private Const PS_GEOMETRIC = &H10000
Private Const PS_DASH As Long = &H1


'---------------------------------------------------

Private Type T_Point
X As Single
Y As Single
End Type

Private Type T_Line
StartPoint As T_Point
EndPoint As T_Point
End Type

Private MyLine As T_Line
Private MidPoint As T_Point
Private BackgroundPicture As IPicture


Private Sub Form_Load()
MidPoint.X = Me.ScaleWidth / 2 + Me.ScaleLeft
MidPoint.Y = Me.ScaleHeight / 2 + Me.ScaleTop
MyLine.StartPoint = MidPoint

'Initialize our backbuffer
Picture1.Visible = False
Picture1.AutoRedraw = True
Picture1.BorderStyle = 0
Picture1.Move Me.ScaleLeft, Me.ScaleTop, Me.ScaleWidth,
Me.ScaleHeight

'Make sure both coordinate systems are the same
Picture1.ScaleLeft = Me.ScaleLeft
Picture1.ScaleTop = Me.ScaleTop
Picture1.ScaleHeight = Me.ScaleHeight
Picture1.ScaleWidth = Me.ScaleWidth

'Draw our background and save it
Picture1.Line (Picture1.ScaleLeft, Picture1.ScaleTop)- _
(MidPoint.X, MidPoint.Y), vbRed, BF
Set BackgroundPicture = Picture1.Image

Picture1.Line (MidPoint.X, MidPoint.Y)- _
(Picture1.ScaleLeft + Picture1.ScaleWidth, _
Picture1.ScaleTop + Picture1.ScaleHeight), vbYellow, BF
Set BackgroundPicture = Picture1.Image
End Sub

Private Sub Render()
Picture1.Cls
Picture1.PaintPicture BackgroundPicture, Picture1.ScaleLeft,
Picture1.ScaleTop

'Render our line
Dim hPen As Long
Dim hOldPen As Long
Dim lob As LOGBRUSH

lob.lbColor = vbBlue
lob.lbStyle = BS_SOLID

hPen = ExtCreatePen(PS_GEOMETRIC Or PS_ENDCAP_ROUND Or PS_DASH,
10, lob, 0, ByVal 0&)
hOldPen = SelectObject(Picture1.hdc, hPen)

Picture1.Line (MyLine.StartPoint.X, MyLine.StartPoint.Y)- _
(MyLine.EndPoint.X, MyLine.EndPoint.Y)

hOldPen = SelectObject(Picture1.hdc, hOldPen)
DeleteObject hPen
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
'Update our line
MyLine.EndPoint.X = X
MyLine.EndPoint.Y = Y
Form_Paint
End Sub

Private Sub Form_Paint()
'Render to backbuffer
Render

'Render backbuffer to frontbufer
Me.PaintPicture Picture1.Image, Me.ScaleLeft, Me.ScaleTop
End Sub

François
Avatar
LE TROLL
Merci "mon chien"...

Ça, ça fai tout, avec des lignes ça devrait aler
plus vite
---------------------------------------------------------------
' ligne form 1
'
Option Explicit
'
Sub Form_Load()
Form1.Caption = " Pointillets"
Form1.AutoRedraw = True
Form1.ScaleMode = 3
End Sub

Sub Form_Activate()
Dim i As Long
Dim j As Long
Dim k As Long
Dim x As Long
Dim y As Long
Dim a As Long
Dim b As Long
Dim c As Long
'
x = 100
y = 150
'
For i = 1 To 3
For j = 1 To 15
PSet (i + x, j + (y - 20)), RGB(250, 0, 250)
Next j
Next i
'
For k = 0 To 100 Step 10
For x = 100 To 140 Step 20
For i = 1 To 15
For j = 1 To 3
DoEvents
PSet (i + x + k, j + y), RGB(0, 0, 0)
Next j
Next i
Next x
'
For a = 1 To 50 ' mettre Timer
For b = 1 To 50
For c = 1 To 50
DoEvents
Next c
Next b
Next a
'
For x = 100 To 140 Step 20
For i = 1 To 15
For j = 1 To 3
DoEvents
PSet (i + x + k, j + y), RGB(236, 236,
216)
Next j
Next i
Next x
Next k
End Sub

Sub Form_Unload(Cancel As Integer)
Unload Form1
End
End Sub



--
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"gap" a écrit dans le
message de news:

Avec VB6, on ne peut pas faire de ligne pointillée
de plus de pixel
d'épaisseur. Il faut utiliser ExtCreatePen pour y
arriver. Je réussis
à faire ça. C'est un Line Method modifié en fait
si je comprends bien.
Maintenant, je voudrais pouvoir déplacer une telle
ligne, ie.
pointillée et épaisse, sans laisser de trace,
comme on peut déplacer
la souris ou encore une ligne (line control) en
modifiant ses
extrémités x1, y1, x2 et y2.

Merci à l'avance pour l'aide.

Jacquelin Hardy
Avatar
gap
A François et LE TROLL,

merci beaucoup de votre aide messieurs.

LE TROLL, ta suggestion s'avère beaucoup plus lente que celle de
"ton chien" !.

François, ta suggestion, ça fonctionne. Mais sur une pictureBox
qui occupe tout un écran de 1280 x 800, c'est plutôt lent. C'est pas
que je suis capricieux mais il y a un mais.
Le mais, c'est que je représente en temps réel des mouvements de
navires sur une carte électronique vectorielle. Celle-ci est faite de
quelques centaines de milliers de points. La position de mon navire
est mise à jour à chaque seconde, et celle des autres navires se
renouvelles aux 5 secondes environ, de façon asynchrone. Et les
vecteurs représentent la direction et la vitesse (par leur longueur).
La carte est renouvelée aux 20 secondes. Ça se fait vite ça.

J'ai eu l'idée de placer ton Form_Paint sur l'évènement MouseUp au
lieu de MouseMove. Cà semble aller mieux. Au moins, on a seulement un
repaint à faire au lieu de plusieurs. Je vais essayer ça en réel cette
nuit et je vous reviens demain.

Y aurait-t-il des RasterOP constants ou des BitWiseOp qui
permettraient de dessiner puis d'effacer virtuellement en redessinant
avec une autre couleur par dessus sans faire un Paint complet de la
PictureBox ?

Dans un groupe anglais, on me suggère de faire mon propre
UserControl. Je suis pas à ce niveau.

Merci de votre temps et de vos connaissances.

Jacquelin H.


On 27 sep, 09:00, "LE TROLL" <le wrote:
Merci "mon chien"...

Ça, ça fai tout, avec des lignes ça devrait aler
plus vite
---------------------------------------------------------------
' ligne form 1
'
Option Explicit



End Sub

--
Romans, logiciels, email, site personnelhttp://irolog.free.fr/joe.htm
------------------------------------------------------------------------- -----------
"gap" a écrit dans le
message de news:

Avec VB6, on ne peut pas faire de ligne pointillée
de plus de pixel
d'épaisseur. Il faut utiliser ExtCreatePen pour y
arriver. Je réussis
à faire ça. C'est un Line Method modifié en fait
si je comprends bien.
Maintenant, je voudrais pouvoir déplacer une telle
ligne, ie.
pointillée et épaisse, sans laisser de trace,
comme on peut déplacer
la souris ou encore une ligne (line control) en
modifiant ses
extrémités x1, y1, x2 et y2.

Merci à l'avance pour l'aide.

Jacquelin Hardy


Avatar
touriste
Bonjour,

Réponse un peu rapide car je n'ais pas lu le code de françois
consciensieusement.


La methode consiste à dessiner en mode XOR

En utilisant l' API SetRop2

un bout de code avec un tracé de ligne (que j'avais sous la main), avec
mode = 7. pour XOR




<<<<
OldMode = SetROP2(mhdc, mode)

UsePen& = CreatePen(PS_SOLID, 1, couleur)
OldPen& = SelectObject(mhdc, UsePen&)

dummy& = MoveToEx&(mhdc, ap1.X, ap1.Y, ap1)
dummy& = LineTo(mhdc, ap2.X, ap2.Y)

dummy& = SelectObject(mhdc, OldPen&)
dummy& = DeleteObject(UsePen&)
dummy& = SetROP2(mhdc, OldMode)
<<<<


A+

Christophe

gap a écrit :
A François et LE TROLL,

merci beaucoup de votre aide messieurs.

LE TROLL, ta suggestion s'avère beaucoup plus lente que celle de
"ton chien" !.

François, ta suggestion, ça fonctionne. Mais sur une pictureBox
qui occupe tout un écran de 1280 x 800, c'est plutôt lent. C'est pas
que je suis capricieux mais il y a un mais.
Le mais, c'est que je représente en temps réel des mouvements de
navires sur une carte électronique vectorielle. Celle-ci est faite de
quelques centaines de milliers de points. La position de mon navire
est mise à jour à chaque seconde, et celle des autres navires se
renouvelles aux 5 secondes environ, de façon asynchrone. Et les
vecteurs représentent la direction et la vitesse (par leur longueur).
La carte est renouvelée aux 20 secondes. Ça se fait vite ça.

J'ai eu l'idée de placer ton Form_Paint sur l'évènement MouseUp au
lieu de MouseMove. Cà semble aller mieux. Au moins, on a seulement un
repaint à faire au lieu de plusieurs. Je vais essayer ça en réel cette
nuit et je vous reviens demain.

Y aurait-t-il des RasterOP constants ou des BitWiseOp qui
permettraient de dessiner puis d'effacer virtuellement en redessinant
avec une autre couleur par dessus sans faire un Paint complet de la
PictureBox ?

Dans un groupe anglais, on me suggère de faire mon propre
UserControl. Je suis pas à ce niveau.

Merci de votre temps et de vos connaissances.

Jacquelin H.


On 27 sep, 09:00, "LE TROLL" <le wrote:

Merci "mon chien"...

Ça, ça fai tout, avec des lignes ça devrait aler
plus vite
---------------------------------------------------------------
' ligne form 1
'
Option Explicit




End Sub

--
Romans, logiciels, email, site personnelhttp://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"gap" a écrit dans le
message de news:

Avec VB6, on ne peut pas faire de ligne pointillée
de plus de pixel
d'épaisseur. Il faut utiliser ExtCreatePen pour y
arriver. Je réussis
à faire ça. C'est un Line Method modifié en fait
si je comprends bien.
Maintenant, je voudrais pouvoir déplacer une telle
ligne, ie.
pointillée et épaisse, sans laisser de trace,
comme on peut déplacer
la souris ou encore une ligne (line control) en
modifiant ses
extrémités x1, y1, x2 et y2.

Merci à l'avance pour l'aide.

Jacquelin Hardy







Avatar
LE TROLL
Bonsoir,

C'est vrai que c'est lent mon truc, on dirait une
limace...
Tu peux aussi le faire avec des lignes, ce devrait
être plus rapide, ou avec des objets, par exemple
des rectangles... J'ai tenté une réponse sans API,
tu aurais dit que c'était pour faire une fusée...

:o)

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"gap" a écrit dans le
message de news:

A François et LE TROLL,

merci beaucoup de votre aide messieurs.

LE TROLL, ta suggestion s'avère beaucoup plus
lente que celle de
"ton chien" !.

François, ta suggestion, ça fonctionne. Mais
sur une pictureBox
qui occupe tout un écran de 1280 x 800, c'est
plutôt lent. C'est pas
que je suis capricieux mais il y a un mais.
Le mais, c'est que je représente en temps réel des
mouvements de
navires sur une carte électronique vectorielle.
Celle-ci est faite de
quelques centaines de milliers de points. La
position de mon navire
est mise à jour à chaque seconde, et celle des
autres navires se
renouvelles aux 5 secondes environ, de façon
asynchrone. Et les
vecteurs représentent la direction et la vitesse
(par leur longueur).
La carte est renouvelée aux 20 secondes. Ça se
fait vite ça.

J'ai eu l'idée de placer ton Form_Paint sur
l'évènement MouseUp au
lieu de MouseMove. Cà semble aller mieux. Au
moins, on a seulement un
repaint à faire au lieu de plusieurs. Je vais
essayer ça en réel cette
nuit et je vous reviens demain.

Y aurait-t-il des RasterOP constants ou des
BitWiseOp qui
permettraient de dessiner puis d'effacer
virtuellement en redessinant
avec une autre couleur par dessus sans faire un
Paint complet de la
PictureBox ?

Dans un groupe anglais, on me suggère de faire
mon propre
UserControl. Je suis pas à ce niveau.

Merci de votre temps et de vos connaissances.

Jacquelin H.


On 27 sep, 09:00, "LE TROLL" <le
wrote:
Merci "mon chien"...

Ça, ça fai tout, avec des lignes ça devrait aler
plus vite
---------------------------------------------------------------
' ligne form 1
'
Option Explicit



End Sub

--
Romans, logiciels, email, site
personnelhttp://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"gap" a écrit dans le
message de news:

Avec VB6, on ne peut pas faire de ligne
pointillée
de plus de pixel
d'épaisseur. Il faut utiliser ExtCreatePen pour
y
arriver. Je réussis
à faire ça. C'est un Line Method modifié en fait
si je comprends bien.
Maintenant, je voudrais pouvoir déplacer une
telle
ligne, ie.
pointillée et épaisse, sans laisser de trace,
comme on peut déplacer
la souris ou encore une ligne (line control) en
modifiant ses
extrémités x1, y1, x2 et y2.

Merci à l'avance pour l'aide.

Jacquelin Hardy


Avatar
touriste
Re,

Avec un peu plus de temps ....

Je gère une problématique similaire depuis un bout de temps: les SIG
(système d'information géographique) et donc la cartographie.

L'idée c'est de ce servir des API graphiques pour gérer l'affichage, ce
dans le DC d'un pictureBox dont la propriété autoredraw est false.

Pour "déplacer" une entité vectorielle ou bitmap de manière
"transparente" il faut:

connaitre la position précédente de l'entité
tracer l'entité en mode XOR (ce qui efface l'entité) puis la tracer en
mode AND (classique) à sa nouvelle position. Etc ...

Fais une recherche avec "metricDC" sur ce forum et tu trouveras du code
pour gérer un DC de pictureBox en mode métrique (ce qui devrait t'etre
utile pour tes cartes).

A+

Christophe

www.corsecarto.net