2009-07-16 6 views
3

Tout d'abord, je suis un vrai débutant à C# alors s'il vous plaît soyez doux. J'essaie d'avoir un cercle qui suit mon curseur. Je ne veux pas laisser de «traînées» derrière moi.Vous voulez un cercle dessiné pour suivre ma souris en C#

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 

    drawCircle(e.X, e.Y); 

} 

private void drawCircle(int x, int y) 
{ 
    Pen skyBluePen = new Pen(Brushes.DeepSkyBlue); 
    Graphics graphics = CreateGraphics(); 
    graphics.DrawEllipse(
     skyBluePen, x - 150, y - 150, 300, 300); 
    graphics.Dispose(); 
    this.Invalidate(); 
} 

Cela fonctionne bien, car il dessine et se centre sur la souris pour chaque déplacement de la souris. Cependant, le "this.Invalidate();" est faux. Il "dessèche" la forme après chaque mouvement, donc je ne peux que voir des aperçus de celui-ci. Cependant, ne pas inclure cela fait que chaque cercle dessiné reste à l'écran. Comment puis-je obtenir un cercle pour «suivre gracieusement» ma souris, sans être trop nerveux et sans conserver tous les cercles du passé?

Répondre

14

Vous pouvez faire quelque chose comme ceci:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     Point local = this.PointToClient(Cursor.Position); 
     e.Graphics.DrawEllipse(Pens.Red, local.X-25, local.Y-25, 20, 20); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     Invalidate(); 
    } 
} 

En fait, le déplacement de la souris, invalider. Sur la peinture, dessinez votre cercle.

+2

Vous pouvez ajouter "this.DoubleBuffered = true;" dans le cadre de la ctor, et il pourrait aussi aider avec une partie du scintillement. –

+0

Est-ce tout ce dont j'ai besoin? Je l'ai collé dedans et il ne fait réellement rien quand je cours en plus d'élever le formulaire/fenêtre ... – cksubs

+0

Eh bien, vous devez relier les événements. J'ai laissé cette partie pour la brièveté. Vous pouvez les ajouter dans l'éditeur de propriétés ou les ajouter dans le ctor avec quelque chose comme ceci.Paint + = Form1_Paint; et this.MouseMove + = Form1_MouseMove; –

1

Vous devez invalider le formulaire AVANT de dessiner votre cercle.

Je suis sûr qu'il y a des façons plus efficaces de le faire en utilisant le double tampon, mais je n'ai pas d'exemple sur le dessus de ma tête.

+0

Cela ne fait pas de différence. Donne le même effet de scintillement. –

1

En général, vous ne souhaitez pas dessiner en dehors du gestionnaire de peinture, car chaque fois que le gestionnaire de peinture s'exécute (ce qui peut être à tout moment), il écrase tout ce que vous avez fait.

Il y a un tas de choses que vous aurez à penser à la suite (comme ce qui se passe lorsque la souris passe en dehors de votre forme, mais cela devrait vous aider à démarrer

using System; 
using System.Drawing; 
using System.Windows.Forms; 

class C:Form 
{ 
static void Main(){Application.Run(new C());} 

private Point? _MousePosition = null; 

protected override void OnMouseMove(MouseEventArgs e) { 
_MousePosition = e.Location; 
this.Invalidate(); 
} 

protected override void OnPaint(PaintEventArgs e) { 
if(_MousePosition.HasValue) { 
    using(Pen skyBluePen = new Pen(Brushes.DeepSkyBlue)) { 
    e.Graphics.DrawEllipse(skyBluePen, _MousePosition.Value.X - 150, _MousePosition.Value.Y - 150, 300, 300); 
    } 
} 
} 
}
+0

pourquoi nommer votre classe C? c'est juste bizarre! –

3

Cela fonctionne -. Juste testé il ...

private int x = 0; 
private int y = 0; 

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    x = e.X; 
    y = e.Y; 

    this.Invalidate(); 
} 

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    Pen skyBluePen = new Pen(Brushes.DeepSkyBlue); 

    e.Graphics.DrawEllipse(skyBluePen, x - 150, y - 150, 300, 300); 

} 
0

la meilleure façon de dessiner quelque chose qui est en train de changer rapidement est d'utiliser un concept connu sous le nom de double tampon. il est vraiment facile de vous faire et vous ne devez pas compter sur le drapeau double tampon Le faire vous-même vous donne une liberté et un contrôle absolus

Fondamentalement, au lieu de dessiner sur le formulaire lui-même, vous faites tout votre dessin sur un bitmap hors écran. Vous ne dessinez que lorsque vous savez que quelque chose a changé (dans votre cas, sur l'événement de déplacement de la souris). Vous ne dessinez sur l'écran que lorsque vous le savez (après le déplacement de la souris ou lorsque l'événement Paint est levé).

private void DrawScene(Point mouseLocation) 
{ 
    myGraphics.Clear(Color.White) 
    myGraphics.DrawEllipse(skyBluePen, mouseLocation.X - 150, mouseLocation.Y - 150, 300, 300); 
    myDrawingSurface.Refresh(); //myDrawingSurface can be a Form or a PictureBox or whatever you'd like. Normally, you'd only Invalidate areas that have changed 
} 

private void myDrawingSurface_MouseMove(object sender, MouseEventArgs e) 
{ 
    DrawScene(e.Location); 
} 

private void myDrawingSurface_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawImage(myBitmap, 0, 0); //Can't remember the exact signature 
} 

Une autre « tricherie » façon de le faire est d'attribuer simplement une propriété d'image de PictureBox à l'image que vous dessinez et appeler refresh sur le PictureBox. Il va gérer le dessin de son image sur l'écran pour vous. Aucun gestionnaire de peinture requis.

Remarque. Vous devez déclarer myBitmap et myGraphics une fois. Le bitmap devra être recréé à la taille appropriée lorsque la surface de dessin change de taille. En outre, ne pas continuer à re-déclarer Stylos et autres objets graphiques encore et encore. Ils devraient être déclarés une fois lorsque votre programme commence. Et jetez-les correctement lorsque votre programme se termine.

1

Essayez d'ajouter les lignes suivantes dans votre constructeur de formulaire:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
this.SetStyle(ControlStyles.UserPaint, true); 

Cela indiquera le formulaire seulement repeindre lorsque vous dites à le faire. Il fournira également un double tampon. Bonne chance!

Questions connexes