Dessiner une line sur une Shape [Résolu]

pecheur_de_truite 7 Messages postés jeudi 4 mai 2006Date d'inscription 5 mai 2006 Dernière intervention - 5 mai 2006 à 12:25 - Dernière réponse : katsankat 577 Messages postés vendredi 30 décembre 2005Date d'inscription 12 juillet 2012 Dernière intervention
- 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 !

@+
Afficher la suite 

10 réponses

Meilleure réponse
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 mai 2006 à 17:19
3
Merci
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

Merci Gobillot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

katsankat 577 Messages postés vendredi 30 décembre 2005Date d'inscription 12 juillet 2012 Dernière intervention - 5 mai 2006 à 13:32
0
Merci
Salut :)

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

Par contre PictureBox en a une.
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 mai 2006 à 14:01
0
Merci
- 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
pecheur_de_truite 7 Messages postés jeudi 4 mai 2006Date d'inscription 5 mai 2006 Dernière intervention - 5 mai 2006 à 14:23
0
Merci
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 ?

@+
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 mai 2006 à 15:02
0
Merci
à 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
pecheur_de_truite 7 Messages postés jeudi 4 mai 2006Date d'inscription 5 mai 2006 Dernière intervention - 5 mai 2006 à 15:20
0
Merci
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 ?

@+
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 5 mai 2006 à 15:33
0
Merci
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
pecheur_de_truite 7 Messages postés jeudi 4 mai 2006Date d'inscription 5 mai 2006 Dernière intervention - 5 mai 2006 à 15:54
0
Merci
Oui OK !!

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

@+
Olivier
pecheur_de_truite 7 Messages postés jeudi 4 mai 2006Date d'inscription 5 mai 2006 Dernière intervention - 5 mai 2006 à 16:17
0
Merci
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 ?
katsankat 577 Messages postés vendredi 30 décembre 2005Date d'inscription 12 juillet 2012 Dernière intervention - 6 mai 2006 à 11:51
0
Merci
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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.