Comment dessiner un rectangle sur MouseDown/Déplacer c#
Je ne suis pas tout à fait sûr de savoir comment dessiner un Rectangle (non rempli) lorsque je fais glisser mon mousedown, tandis que le clic gauche de la souris.
J'ai jusqu'à présent
private void canevas_MouseDown( object sender , MouseEventArgs e )
{
if( e.Button == MouseButtons.Left )
{
_topLeft = new Point( e.X , e.Y );
_drawing = true;
}
}
private void canevas_MouseMove( object sender , MouseEventArgs e )
{
if( _drawing )
{
Rectangle rec = new Rectangle( _topLeft.X , _topLeft.Y , ( e.X - _topLeft.X ) , ( e.Y - _topLeft.Y ) );
canevas.CreateGraphics().DrawRectangle( Pens.Black , rec );
}
}
Mais les problèmes que je ne veux pas tous les rectangles de montrer
OriginalL'auteur Burnzy | 2010-10-30
Vous devez vous connecter pour publier un commentaire.
Un peu de code pour aller avec Ed la réponse correcte:
Pour obtenir un "canevas" qui a le double-buffering allumé, donc la peinture ne clignote pas, l'utilisation de Projet + Ajouter un Nouvel Élément, sélectionnez "Classe" et collez ce code:
De la compilation. Faites glisser le nouveau contrôle à partir du haut de la boîte à outils sur votre formulaire, en remplacement de l'origine du canevas'. Mettre à jour les gestionnaires d'événements en conséquence.
Tout semble ok jusqu'à présent, sauf que le scintillement, des idées?
J'ai laissé un commentaire, êtes-vous à l'aide électronique.Graphiques dans la Peinture de l'événement? J'ai testé ce code, il est de scintillement, même sans double-buffering.
oui, je suis, cependant, le scintillement peut dépendre du contexte. Il l'habitude de clignoter si ses un jeu de gris, mais sinon il n'. EDIT nvm, il toujours clignote même lorsque le contexte est clair, simple
Ce que le diable est un "jeu de gris"? Et ce qui est dans le fond?
OriginalL'auteur Hans Passant
Ne pas appeler CreateGraphics. Dans MouseDown, de stocker la position de départ et un drapeau pour indiquer que vous êtes le dessin. Dans MouseMove, vérifiez l'indicateur. Si vous dessinez, créez le rectangle par rapport à la position de départ et le ranger (qui vous le font déjà), puis d'appeler Invalidate(). L'ensemble de votre code de dessin sera en OnPaint() (toile.La peinture de l'extérieur de la classe, bien que je serait probablement de créer ma propre classe pour ce pour éviter de salir votre code de formulaire avec ce genre de choses).
Dessin doit être fait dans votre gestionnaire de peinture (OnPaint). Si vous dessinez en dehors de cela, votre objet graphique n'est pas effacé (d'où les multiples rectangles) et tout ce que vous dessinez est/peut être anéanti en apparence bizarre fois lors de votre fenêtre reçoit un message WM_PAINT.
EDIT: Maintenant que vous rencontrez des problèmes de performances, il ya un couple de façons simples pour optimiser la peinture un peu. D'abord, la nullité sera éventuellement prendre un Rectangle comme argument de sorte que vous n'avez pas à repeindre l'ensemble de contrôle. Deuxièmement, si vous tirez sur MouseMove vous allez dessiner un peu. En utilisant la double mise en mémoire tampon, ce sera beaucoup trop, il suffit de régler le DoubleBuffered true à la propriété ou de l'ajouter à la ControlStyles valeur en appelant SetStyle sur le contrôle.
Invalider innvalidates les graphismes du contrôle, de sorte que l'opération de peinture est de nouveau appelé par windows. (En gros, une fois que le contrôle est invalidé, il doit se redessiner)
une idée de comment résoudre le problème de scintillement?
J'ai ajouté quelques conseils. Aussi se rendre compte que, si vous faites appel CreateGraphics (qui vous ne devriez pas faire ici de toute façon), vous devez également appeler dispose() sur le retour de l'objet Graphique.
Merci pour l'astuce, mais pourquoi devrais-je le faire?
OriginalL'auteur Ed S.
Bien maintenant, j'ai ce, de son travail, mais, il scintille beaucoup, même avec le double buffering.
Puis sur la peinture
OriginalL'auteur Burnzy
Ajouter ce code à votre formulaire .cela pourrait réduire le scintillement!
OriginalL'auteur raghu