Dessiner une line sur une Shape

Résolu
pecheur_de_truite Messages postés 7 Date d'inscription jeudi 4 mai 2006 Statut Membre Dernière intervention 5 mai 2006 - 5 mai 2006 à 12:25
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 - 6 mai 2006 à 11:51
Bonjour à vous,

j'ai déplacé ce sujet depuis le thème Divers vers le thème Graphique.



voici mon problème :
j'aimerais :
- dessiner des traits dynamiquement dans une shape avec la fonction "line" (ça c'est OK)
- mette une couleur de fond à la Shape (ça aussi)
- et surtout que la form dans laquelle se trouve la Shape ait la propriété AutoRedraw = true

comment faire pour que mes traits apparaissent, et restent ?
A cause de la propriété AutoRedraw = true, ils n'apparaissent pas !

@+

10 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 mai 2006 à 17:19
je corrige le code précédent, il manque le nom.

For i = 1 To nombreline

Unload Line1(i)

Next



en mémoire ça va prendre un peu de place mais pas trop,

je compte quelques centaines de milliers d'octets pour 1200 controles,

c'est pas énorme et c'est un controle qui prend le moins de mémoire,.

en ressource ça prend 10% pendant un temps assez court, donc c'est assez raisonnable

en temps machine je sais pas, j'ai pas testé.

on peut peut être optimiser, et ne pas recharger les mêmes controles à
chaque fois, mais ça va obliger à tester et ça va prendre encore du
temps... à voir


je pense à autre chose:

tu peux remplacer les shapes par des rectangles:

Me.Line (100, 100)-(300, 300), vbRed, BF

mais faudra les redessiner à chaque fois, ou les mettre dans l'évênement Form_Paint, et enlever l'Autoredraw.

ça aussi ça prend pas mal de ressources.



Daniel
3
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
5 mai 2006 à 13:32
Salut :)

Le contrôle Shape n' a pas de propriété Autoredraw.

Par contre PictureBox en a une.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 mai 2006 à 14:01
- dessiner des traits dynamiquement dans une shape avec la fonction "line" (ça c'est OK)



ben non c'est pas OK,

tu dessine sur la Forme et pas dans la Shape,

donc les lignes seront toujours en dessous des contrôles.



- mette une couleur de fond à la Shape (ça aussi)



si la Shape n'est plus transparente la ligne n'apparaitra plus



- et surtout que la form dans laquelle se trouve la Shape ait la propriété AutoRedraw = true



ben justement c'est ce qui empêche la ligne de s'effacer



si tu veux une ligne au dessus de la shape, tu peux mettre le contrôle line

ça marche sur certains contrôles (shape, Label, image)

et pas d'autres (picturebox, bouton)


Daniel
0
pecheur_de_truite Messages postés 7 Date d'inscription jeudi 4 mai 2006 Statut Membre Dernière intervention 5 mai 2006
5 mai 2006 à 14:23
Bonjour,

Ce que tu dis est vrai sur toute la ligne !!!
Par contre concernant le contrôle line à mettre au-dessus de la Shape, c'est vrai que c'est une solution ...
MAIS, mon appli représente un sonogramme, dont les amplitudes sont dessinées par des lines, donc je peux pas dessiner + de 1000 contrôles lines ...
De plus actuellement pour effacer le sonogramme, je fais Form.Cls, et ensuite je rappelle la fonctionne derrière pour afficher le sonogramme suivant.

Si vous avez une idée ?

@+
0

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 mai 2006 à 15:02
à moins d'avoir des shapes transparentes, je vois pas comment faire.

avec des controles en dynamiques, ça marche,

j'arrive à 1257 contrôles

il faut Me.Scalemode en pixels.

pour le cls, il faut faire les Unload correspondants





Private Sub Command1_Click()

Dim i As Integer

Dim x As Double

Dim y As Double

Dim z As Double



Me.Line (0, Me.ScaleHeight / 2)-(Me.ScaleWidth, Me.ScaleHeight / 2), vbGreen



For z = 0 To 6.28 Step 0.005

i = i + 1

Load Line1(i)

Line1(i).X1 = x

Line1(i).Y1 = y

x = z * 100

y = Sin(z) * 100 + Me.ScaleHeight / 2

Line1(i).X2 = x

Line1(i).Y2 = y

Line1(i).ZOrder

Line1(i).Visible = True

Next

MsgBox i



End Sub


Daniel
0
pecheur_de_truite Messages postés 7 Date d'inscription jeudi 4 mai 2006 Statut Membre Dernière intervention 5 mai 2006
5 mai 2006 à 15:20
Re,
merci pour ta réponse ...
Donc si je comprends bien tu dessines une seul ligne en graphique sur ta form avec un index = 4000 ou 5000
et inatégnable par ta boucle, c'est bien ça ?
Et ensuite il faut remplacer tous les .cls par des une boucle qui unloade toutes les lignes, c'est bien ça aussi ?

@+
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 mai 2006 à 15:33
oui,

tu met un controle line, un seul avec index = 0

bien sur j'ai exagéré pour le step 0.005
parce que si le pas est trop petit, les controles line ne sont pas
visibles, mais ici c'était des coordonnées calculées pour une fonction
sinus.


pour le cls faut avoir conservé le nombre de line créées.

le faire avant de créer un nouveau graphique.

For i = 1 To nombreline

Unload i

Next




Daniel
0
pecheur_de_truite Messages postés 7 Date d'inscription jeudi 4 mai 2006 Statut Membre Dernière intervention 5 mai 2006
5 mai 2006 à 15:54
Oui OK !!

Et bien en tout cas, Monsieur Gobillot,
grand merci et chapeau bas !

@+
Olivier
0
pecheur_de_truite Messages postés 7 Date d'inscription jeudi 4 mai 2006 Statut Membre Dernière intervention 5 mai 2006
5 mai 2006 à 16:17
Ha au fait, penses-tu que ce soit + long en teme de temps machine ou que ça prenne + de ressource CPU ou ressource mémoire de faire ainsi plutôt qu'avec la fonction object.Line ?
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
6 mai 2006 à 11:51
Depuis quand il vaut mieux charger 25000 contrôles là ou
picture1.Line() et Picture1.cls font l' affaire? Dans un contrôle
utilisateur ça autoredrawe bien en plus.
0
Rejoignez-nous