Vuoi un cerchio disegnato per seguire il mio mouse in C#

Prima di tutto, io sono un vero beginer in C# quindi, si prega di essere gentile.

Sto cercando di avere un cerchio di seguire il mio cursore. Non voglio I “sentieri” per essere lasciato alle spalle.

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();
}

Questo funziona ok, come non lo attira e centri del mouse per ogni spostamento del mouse. Tuttavia, “questo.Invalidate();” è sbagliato. “Undraws” la forma dopo ogni movimento, quindi posso solo vedere scorci di esso. Tuttavia, fra le cause di ogni singolo cerchio disegnato per rimanere sullo schermo.

Come faccio ad ottenere un cerchio di “grazia” seguire il mio mouse, senza essere troppo nervoso e senza ritegno tutti gli ultimi cerchi?

OriginaleL’autore cksubs | 2009-07-16

6 Replies
  1. 13

    Si può fare qualcosa di simile a questo:

    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();
        }
    }

    Fondamentalmente, il movimento del mouse, invalida.
    Sulla Vernice per disegnare il cerchio.

    È possibile aggiungere”.DoubleBuffered = true;” come parte di un costruttore, e potrebbe anche aiutare con un po ‘ di flickering.
    È questo tutti avrei bisogno? Ho incollato e che in realtà non fa nulla quando ho Eseguito oltre a portare il modulo/finestra…
    Beh, devi collegare gli eventi. Ho lasciato che parte per brevità. Si possono aggiungere la loro proprietà editor o aggiungerli in un costruttore con qualcosa di simile a questo.Vernice += Form1_Paint; e questo.MouseMove += Form1_MouseMove;
    public Form1() { InitializeComponent(); Vernice += Form1_Paint; questo.MouseMove += Form1_MouseMove; } potreste spiegare come questi due bit nel costruttore di lavoro?
    Il “+=” aggiunge un delegato (cioè type-safe “richiamata”) per l’evento. Ci potrebbe essere più delegati allegato, in modo da dovete fare un += o -= staccare. Questo link parla di Creazione di Eventi per Windows Form: msdn.microsoft.com/en-us/library/dacysss4.aspx Che è solo un punto di partenza di base.

    OriginaleL’autore Erich Mirabal

  2. 3

    Funziona – solo provato…

    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);
    
    }

    OriginaleL’autore

  3. 1

    È necessario invalidare la forma PRIMA di iniziare a disegnare il cerchio.

    Io sono positivo che non ci sono più efficienti modi per fare questo doppio buffering, ma non ho un esempio fuori della parte superiore della mia testa.

    Doesnt fare la differenza. Dà lo stesso effetto di sfarfallio.

    OriginaleL’autore Chris Thompson

  4. 1

    È di solito non vogliono fare un disegno al di fuori della vernice gestore perché ogni volta che la vernice gestore esegue (che potrebbe essere in qualsiasi momento) sovrascriverà quello che avete fatto.

    Ci sono un sacco di cose che si dovrà pensare alla fine (come accade quando il mouse va al di fuori della vostra forma, ma questo dovrebbe iniziare.

    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);
      }
     }
    }
    }
    perché il nome di classe C? che è proprio strano!

    OriginaleL’autore

  5. 1

    Provare ad aggiungere le righe seguenti nel costruttore del Form:

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

    Questo dirà il Modulo solo riverniciare quando gli si dice di fare così. Esso fornirà anche il doppio buffer. Buona fortuna!

    OriginaleL’autore bufferz

  6. 0

    Il modo migliore per disegnare qualcosa che cambia rapidamente è quello di usare un concetto noto come il double buffering. È davvero facile da fare e non fare affidamento sul doppio buffer bandiera. Farlo da soli dà completa libertà e controllo.

    In sostanza, invece di disegnare sul Modulo stesso, consente di fare tutto il disegno su un off-screen Bitmap. Si traggono solo quando si sa che qualcosa è cambiato (nel tuo caso, il mouse, spostare l’evento). È solo disegnare sullo schermo quando sai di avere (dopo il movimento del mouse o quando la Vernice evento viene generato).

    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
    }

    Un altro “barare” modo di fare è semplicemente di assegnare una PictureBox proprietà di Immagine per l’immagine che si sta disegnando e chiamata di Aggiornamento sulla PictureBox. Sarà gestire il disegno la sua immagine sullo schermo per voi. Nessuna Vernice gestore richiesto.

    Nota. È necessario dichiarare myBitmap e myGraphics una volta. La Bitmap dovranno essere ricreati alla dimensione appropriata quando la superficie di disegno cambia dimensione. Inoltre, non NON continuare a ri-dichiarare Penne e altri oggetti di grafica più e più volte. Dovrebbero essere dichiarati una volta quando il programma si avvia. E smaltirle correttamente quando il programma viene chiuso.

    OriginaleL’autore colithium

Lascia un commento