Je voudrais dessiner une ligne à l'écran, en fonction de la souri :
L'utilisateur clique à un point, qui est l'origine de la droite, et il
déplace sa souris. La droite est dessinée entre le point d'origine, et la
position courrante de la souris, surtout si la souris bouge.
Pour le moment, je fais un invalidate() avec un rectangle allant du point
d'origine à la position de la souris. Cependant, ca blink :o/
"Julien Bakmezdjian [MS]" a écrit dans le message de news:
Bonjour,
Je pense que Mathieu souhaite que la deuxième extrémité de la ligne
"suive"
le pointeur de la souris, pendant tout le temps que le bouton est pressé.
Pourquoi ne pas essayer un Graphics.DrawRectangle pour 'effacer' la ligne précédente, suivi d'un DrawLine ? Le tout dans le mousemove. Peut-être que ce sera plus rapide que le Invalidate...
Sauf que si je fais un DrawRectangle, ca va effacer ce que j'ai en dessous.
"Julien Bakmezdjian [MS]" a écrit dans le message de news:
Bonjour,
Il faut créer un objet Graphics grâce à la méthode statique Graphics.FromHwnd. En lui passant le handle du panel, vous devriez pouvoir récupérer un graphics qui y est associé.
Sauf que je vais obtenir un nouvel graphic, et que j'en ai déjà 2 (celui pour afficher, et celui ou j'écris avant d'afficher).
Donc, je repose la question : comment afficher une ligne qui suive la souris, avec du double buffering ? (j'ai le buffer screen où je stock ce que je veux afficher)
"Julien Bakmezdjian [MS]" <julienba@online.microsoft.com> a écrit dans le
message de news:utTIXBLcEHA.1144@TK2MSFTNGP11.phx.gbl...
Bonjour,
Je pense que Mathieu souhaite que la deuxième extrémité de la ligne
"suive"
le pointeur de la souris, pendant tout le temps que le bouton est pressé.
Pourquoi ne pas essayer un Graphics.DrawRectangle pour 'effacer' la ligne
précédente, suivi d'un DrawLine ? Le tout dans le mousemove. Peut-être que
ce sera plus rapide que le Invalidate...
Sauf que si je fais un DrawRectangle, ca va effacer ce que j'ai en dessous.
"Julien Bakmezdjian [MS]" <julienba@online.microsoft.com> a écrit dans le
message de news:OfcE8KwcEHA.3596@tk2msftngp13.phx.gbl...
Bonjour,
Il faut créer un objet Graphics grâce à la méthode statique
Graphics.FromHwnd. En lui passant le handle du panel, vous devriez pouvoir
récupérer un graphics qui y est associé.
Sauf que je vais obtenir un nouvel graphic, et que j'en ai déjà 2 (celui
pour afficher, et celui ou j'écris avant d'afficher).
Donc, je repose la question :
comment afficher une ligne qui suive la souris, avec du double buffering ?
(j'ai le buffer screen où je stock ce que je veux afficher)
"Julien Bakmezdjian [MS]" a écrit dans le message de news:
Bonjour,
Je pense que Mathieu souhaite que la deuxième extrémité de la ligne
"suive"
le pointeur de la souris, pendant tout le temps que le bouton est pressé.
Pourquoi ne pas essayer un Graphics.DrawRectangle pour 'effacer' la ligne précédente, suivi d'un DrawLine ? Le tout dans le mousemove. Peut-être que ce sera plus rapide que le Invalidate...
Sauf que si je fais un DrawRectangle, ca va effacer ce que j'ai en dessous.
"Julien Bakmezdjian [MS]" a écrit dans le message de news:
Bonjour,
Il faut créer un objet Graphics grâce à la méthode statique Graphics.FromHwnd. En lui passant le handle du panel, vous devriez pouvoir récupérer un graphics qui y est associé.
Sauf que je vais obtenir un nouvel graphic, et que j'en ai déjà 2 (celui pour afficher, et celui ou j'écris avant d'afficher).
Donc, je repose la question : comment afficher une ligne qui suive la souris, avec du double buffering ? (j'ai le buffer screen où je stock ce que je veux afficher)
Mathieu Chavoutier
"Phildes" a écrit dans le message de news:
> Mais pour afficher une ligne qui suit la souris, je sais pas :o/ C'est le même principe : a - on construit une image dans un Bitmap-de-travail a.1 - on efface l'ancien trait en redessinant le fond a.2 - on dessine le nouveau trait b - on dessine ce Bitmap dans la zone client de la fenêtre.
J'ai fait ce que tu viens de dire, seulement voilà, j'ai toujours le même problème : ça blink. Pour dessiner la ligne, aucun problème. Mais, pour qu'elle soit affichée à l'écran, je dois nécessairement faire un Invalidate(), et donc, tout le rectangle doit être redessiné.
Donc, je ne sais pas comment faire pour afficher quelque chose sans faire un invalidate, ou alors, j'ai pas compris :o)
"Phildes" <phildes2@wanadoo.fr> a écrit dans le message de
news:u1iw7gxcEHA.3716@TK2MSFTNGP11.phx.gbl...
> Mais pour afficher une ligne qui suit la souris, je sais pas :o/
C'est le même principe :
a - on construit une image dans un Bitmap-de-travail
a.1 - on efface l'ancien trait en redessinant le fond
a.2 - on dessine le nouveau trait
b - on dessine ce Bitmap dans la zone client de la fenêtre.
J'ai fait ce que tu viens de dire, seulement voilà, j'ai toujours le même
problème : ça blink.
Pour dessiner la ligne, aucun problème. Mais, pour qu'elle soit affichée à
l'écran, je dois nécessairement
faire un Invalidate(), et donc, tout le rectangle doit être redessiné.
Donc, je ne sais pas comment faire pour afficher quelque chose sans faire un
invalidate, ou alors, j'ai pas compris :o)
> Mais pour afficher une ligne qui suit la souris, je sais pas :o/ C'est le même principe : a - on construit une image dans un Bitmap-de-travail a.1 - on efface l'ancien trait en redessinant le fond a.2 - on dessine le nouveau trait b - on dessine ce Bitmap dans la zone client de la fenêtre.
J'ai fait ce que tu viens de dire, seulement voilà, j'ai toujours le même problème : ça blink. Pour dessiner la ligne, aucun problème. Mais, pour qu'elle soit affichée à l'écran, je dois nécessairement faire un Invalidate(), et donc, tout le rectangle doit être redessiné.
Donc, je ne sais pas comment faire pour afficher quelque chose sans faire un invalidate, ou alors, j'ai pas compris :o)
Julien Bakmezdjian [MS]
Bonjour,
Vous pouvez récupérer un objet Graphics grâce à la méthode CreateGraphics de la form (ou du contrôle sur lequel vous dessinez, peu importe). Faites-le une seule fois, au début du programme (dans un objet Graphics membre de la classe). Créez ensuite une méthode RefreshLine qui prend en paramètre les coordonnées du rectangle à rafraîchir. Dessinez alors sur l'objet Graphics précédemment créé.
Cordialement,
Julien
"Mathieu Chavoutier" a écrit dans le message de news:
"Phildes" a écrit dans le message de news: > > Mais pour afficher une ligne qui suit la souris, je sais pas :o/ > C'est le même principe : > a - on construit une image dans un Bitmap-de-travail > a.1 - on efface l'ancien trait en redessinant le fond > a.2 - on dessine le nouveau trait > b - on dessine ce Bitmap dans la zone client de la fenêtre.
J'ai fait ce que tu viens de dire, seulement voilà, j'ai toujours le même problème : ça blink. Pour dessiner la ligne, aucun problème. Mais, pour qu'elle soit affichée à l'écran, je dois nécessairement faire un Invalidate(), et donc, tout le rectangle doit être redessiné.
Donc, je ne sais pas comment faire pour afficher quelque chose sans faire
un
invalidate, ou alors, j'ai pas compris :o)
Bonjour,
Vous pouvez récupérer un objet Graphics grâce à la méthode CreateGraphics de
la form (ou du contrôle sur lequel vous dessinez, peu importe). Faites-le
une seule fois, au début du programme (dans un objet Graphics membre de la
classe).
Créez ensuite une méthode RefreshLine qui prend en paramètre les coordonnées
du rectangle à rafraîchir. Dessinez alors sur l'objet Graphics précédemment
créé.
Cordialement,
Julien
"Mathieu Chavoutier" <nospam@no.spam> a écrit dans le message de
news:uj4aL7efEHA.3632@TK2MSFTNGP09.phx.gbl...
"Phildes" <phildes2@wanadoo.fr> a écrit dans le message de
news:u1iw7gxcEHA.3716@TK2MSFTNGP11.phx.gbl...
> > Mais pour afficher une ligne qui suit la souris, je sais pas :o/
> C'est le même principe :
> a - on construit une image dans un Bitmap-de-travail
> a.1 - on efface l'ancien trait en redessinant le fond
> a.2 - on dessine le nouveau trait
> b - on dessine ce Bitmap dans la zone client de la fenêtre.
J'ai fait ce que tu viens de dire, seulement voilà, j'ai toujours le même
problème : ça blink.
Pour dessiner la ligne, aucun problème. Mais, pour qu'elle soit affichée à
l'écran, je dois nécessairement
faire un Invalidate(), et donc, tout le rectangle doit être redessiné.
Donc, je ne sais pas comment faire pour afficher quelque chose sans faire
Vous pouvez récupérer un objet Graphics grâce à la méthode CreateGraphics de la form (ou du contrôle sur lequel vous dessinez, peu importe). Faites-le une seule fois, au début du programme (dans un objet Graphics membre de la classe). Créez ensuite une méthode RefreshLine qui prend en paramètre les coordonnées du rectangle à rafraîchir. Dessinez alors sur l'objet Graphics précédemment créé.
Cordialement,
Julien
"Mathieu Chavoutier" a écrit dans le message de news:
"Phildes" a écrit dans le message de news: > > Mais pour afficher une ligne qui suit la souris, je sais pas :o/ > C'est le même principe : > a - on construit une image dans un Bitmap-de-travail > a.1 - on efface l'ancien trait en redessinant le fond > a.2 - on dessine le nouveau trait > b - on dessine ce Bitmap dans la zone client de la fenêtre.
J'ai fait ce que tu viens de dire, seulement voilà, j'ai toujours le même problème : ça blink. Pour dessiner la ligne, aucun problème. Mais, pour qu'elle soit affichée à l'écran, je dois nécessairement faire un Invalidate(), et donc, tout le rectangle doit être redessiné.
Donc, je ne sais pas comment faire pour afficher quelque chose sans faire
un
invalidate, ou alors, j'ai pas compris :o)
Mathieu Chavoutier
"Julien Bakmezdjian [MS]" a écrit dans le message de news:ey9%
Bonjour,
Vous pouvez récupérer un objet Graphics grâce à la méthode CreateGraphics
de
la form (ou du contrôle sur lequel vous dessinez, peu importe). Faites-le une seule fois, au début du programme (dans un objet Graphics membre de la classe).
Pourquoi le faire au début ? Je veux pouvoir dessiner sur la page, puis quand je rajoute une droite, pouvoir déplacer ma droite sans problèmes. Si je crée un graphic depuis le début, mes modifications ne seraient pas prises en compte.
Créez ensuite une méthode RefreshLine qui prend en paramètre les
coordonnées
du rectangle à rafraîchir. Dessinez alors sur l'objet Graphics
précédemment
créé.
Mais ça, ça va dessiner la droite sur le dessin, on est d'accord. Mais comment je fais pour que ca l'affiche ? Pour le moment, si je fais pas de Invalidate, il ne veut pas dessiner sur la partie adéquate. Ou alors, j'ai pas tout compris.
"Julien Bakmezdjian [MS]" <julienba@online.microsoft.com> a écrit dans le
message de news:ey9%23NLvfEHA.3700@TK2MSFTNGP12.phx.gbl...
Bonjour,
Vous pouvez récupérer un objet Graphics grâce à la méthode CreateGraphics
de
la form (ou du contrôle sur lequel vous dessinez, peu importe). Faites-le
une seule fois, au début du programme (dans un objet Graphics membre de la
classe).
Pourquoi le faire au début ?
Je veux pouvoir dessiner sur la page, puis quand je rajoute une droite,
pouvoir déplacer ma droite sans problèmes. Si je crée un graphic depuis le
début, mes modifications ne seraient pas prises en compte.
Créez ensuite une méthode RefreshLine qui prend en paramètre les
coordonnées
du rectangle à rafraîchir. Dessinez alors sur l'objet Graphics
précédemment
créé.
Mais ça, ça va dessiner la droite sur le dessin, on est d'accord. Mais
comment je fais pour que ca l'affiche ? Pour le moment, si je fais pas de
Invalidate, il ne veut pas dessiner sur la partie adéquate. Ou alors, j'ai
pas tout compris.
"Julien Bakmezdjian [MS]" a écrit dans le message de news:ey9%
Bonjour,
Vous pouvez récupérer un objet Graphics grâce à la méthode CreateGraphics
de
la form (ou du contrôle sur lequel vous dessinez, peu importe). Faites-le une seule fois, au début du programme (dans un objet Graphics membre de la classe).
Pourquoi le faire au début ? Je veux pouvoir dessiner sur la page, puis quand je rajoute une droite, pouvoir déplacer ma droite sans problèmes. Si je crée un graphic depuis le début, mes modifications ne seraient pas prises en compte.
Créez ensuite une méthode RefreshLine qui prend en paramètre les
coordonnées
du rectangle à rafraîchir. Dessinez alors sur l'objet Graphics
précédemment
créé.
Mais ça, ça va dessiner la droite sur le dessin, on est d'accord. Mais comment je fais pour que ca l'affiche ? Pour le moment, si je fais pas de Invalidate, il ne veut pas dessiner sur la partie adéquate. Ou alors, j'ai pas tout compris.
Mathieu Chavoutier
Je réexplique mon problème : je veux afficher une ligne, comme avec paint : je clic à un endroit (clicDown), je bouge la souris, et ça dessine une droite, qui va de l'endroit où j'ai cliqué, à l'endroit où se trouve le pointeur de ma souris. Et dès que je lache la souris (clicUp), la droite reste. (testez avec paint, ça sera peut-être plus clair :oD)
J'arrive tout à fait à faire en sorte que la droite suive le pointeur de la souris. Le gros problème, c'est que je n'arrive pas à supprimer les droites précédentes : http://img26.exs.cx/img26/4302/GRRRRRRRRRRRR.png (j'ai cliqué au centre du machin noir, et j'ai fait tourner la souris autour).
Donc, comment faire pour supprimer les droites précédentes ?
J'ai essayé de créer un autre Bitmap, contenant le reste du dessin avant de commencer à dessiner la droite. Et, à chaque fois que je bouge la souris, j'affiche ce Bitmap pour supprimer l'ancienne droite. Mais, ça ne marche pas.
Pourquoi ? Qui a une solution ? Un indice ?
Je donne des bouts de code, ça pourrait être utile :
e.Graphics.DrawImage(buffer, new Rectangle(0, 0, 800, 600), 0, 0, 800, 600, GraphicsUnit.Pixel, imageAttr); // là, je repeinds tout
}
Si vous voulez plus de code ou plus d'explications, n'hésitez pas à le demander :o)
Je réexplique mon problème :
je veux afficher une ligne, comme avec paint : je clic à un endroit
(clicDown), je bouge la souris, et ça dessine une droite, qui va de
l'endroit où j'ai cliqué, à l'endroit où se trouve le pointeur de ma souris.
Et dès que je lache la souris (clicUp), la droite reste. (testez avec paint,
ça sera peut-être plus clair :oD)
J'arrive tout à fait à faire en sorte que la droite suive le pointeur de la
souris.
Le gros problème, c'est que je n'arrive pas à supprimer les droites
précédentes : http://img26.exs.cx/img26/4302/GRRRRRRRRRRRR.png
(j'ai cliqué au centre du machin noir, et j'ai fait tourner la souris
autour).
Donc, comment faire pour supprimer les droites précédentes ?
J'ai essayé de créer un autre Bitmap, contenant le reste du dessin avant de
commencer à dessiner la droite. Et, à chaque fois que je bouge la souris,
j'affiche ce Bitmap pour supprimer l'ancienne droite. Mais, ça ne marche
pas.
Pourquoi ? Qui a une solution ? Un indice ?
Je donne des bouts de code, ça pourrait être utile :
Je réexplique mon problème : je veux afficher une ligne, comme avec paint : je clic à un endroit (clicDown), je bouge la souris, et ça dessine une droite, qui va de l'endroit où j'ai cliqué, à l'endroit où se trouve le pointeur de ma souris. Et dès que je lache la souris (clicUp), la droite reste. (testez avec paint, ça sera peut-être plus clair :oD)
J'arrive tout à fait à faire en sorte que la droite suive le pointeur de la souris. Le gros problème, c'est que je n'arrive pas à supprimer les droites précédentes : http://img26.exs.cx/img26/4302/GRRRRRRRRRRRR.png (j'ai cliqué au centre du machin noir, et j'ai fait tourner la souris autour).
Donc, comment faire pour supprimer les droites précédentes ?
J'ai essayé de créer un autre Bitmap, contenant le reste du dessin avant de commencer à dessiner la droite. Et, à chaque fois que je bouge la souris, j'affiche ce Bitmap pour supprimer l'ancienne droite. Mais, ça ne marche pas.
Pourquoi ? Qui a une solution ? Un indice ?
Je donne des bouts de code, ça pourrait être utile :