-
1 pièce(s) jointe(s)
Problème pour dessiner.
Salut tout le monde,
J'ai un petit problème, dans une picturebox géante, je mets dynamiquement plusieurs PictureBox que je peux déplacer grâce a l'attribut Picturebox.mousemove que j'ai implémenté.
Je souhaite que en cliquant (long) sur les petites Pb et la touche CTRL dessiner un trait de manière dynamique afin de les relier.
Comment pourrais je faire? en sachant que pour le moment je n'arrive qu'a tracer des lignes fixes (le mouvement de la souris n'a aucun effet de ssus.
-
les winforms ne sont pas trop fait pour faire ca, ca risque de ramer pas mal
si tu peux passe en wpf
sinon la technique c'est d'utiliser un bufferedgraphics
de déssiner l'image puis le trait en fonction de où est là souris
et enfin render sur le picturebox
le tout plusieurs fois par seconde, ce qui fera un joli saccadement je pense, mais ca reste à tester
en diminuant artificiellement l'appel de l'evenement ca peut ptete passer
-
salut
je ne prendrais pas le problème comme celà.
Perso, j'ai déja fait ce genre d'application et la solution retenue était la suivante :
1 / Un controle utilisateur dans lequel je peux ajouter des Images :)
2 / Le controle gère chaque image sous forme de "Shape"..
une shape ayant une méthode Render() et appartenant à la collection de Shape de l'UC.
3/ Cet UC gère le mouseDown, etc... en le relayant eventuellement aux shapes pour qu'elles saches quoi faire.
4/ Après, pour dessiner les lignes, j'utilise le MouseDown pour définir un mode de saisie et de mémorisation des points de la souris, et à chaque mouseMove de la souris de l'UC, j'ajoute un point que je trace dans la méthode OnPaint() de cet UC.
Evidemment, je definis une Region pour chaque "Image" comme cela, quand je clique sur une image pour la déplacer, je peux facilement detecter sur quelle region je suis et donc quelle image déplacer...
Tout le dessin est fait dans le OnPaint() de l'UC qui appelle une méthode Render(Graphics) de chaque Shape que j'ai crée (et qui contiendrait dans ton cas le rendu d'une image).
Ainsi, Un seul GRAPHICS objet est utilisé (celui de l'UC) et passé à chaque Shape pour quelle fasse son Rendu..)
Avantage : Performance au rendez-vous. Gestion de la transparence. Gestion du Z-Order facile à faire (suffit d'avoir une liste des objets et de changer l'ordre d'appel du Render() en fonction de ce Z-Order))
Voila...
Faut compter 1 journée pour réaliser un tel controle :)
-
Merci pour ton aide, mais entre temps j'avais pensé à autre chose qui fonctionne en deux temps:
Le premier clik determine l'objet "composant" et recupère la position de la souris sur la grande PictureBox, ensuite le second clique determine l'objet "second composant" et sauve la position de la souris. Ensuite un alogorythme trace la liaision en ligne verticale et horizontale.
Le problème avec ce que tu me proposes et que je dois modifier toutes la partie graphique de mon application.
Vus que tout est cré dynamiquement je me seres d'un arraylist pour tout gérer. Chaque composant a une PB et un label affillié, ainsi qu'une Form modulable. Et à mon avis c'est pas un jour de travail qu'il va me falloir mais une bonne semaine...
Mais si ma méthode plombe trop les performances, alors je me pencherais sur ta solution qui parait interessante meme si je n'ai pas tout compris.