Estoy tratando de dibujar una sola línea mediante OnMouseMove() evento. Mi Problema es que cada vez que muevo el ratón sale un sendero. Traté de usar el método de actualización, pero cuando voy a parar de mover el ratón la línea se ha ido. No quiero que la línea que se dibuja OnPaint();, Sólo quiero dibujar OnMouseMove().

EDICIÓN: estoy usando un panel transparente(cp.ExStyle |= 0x20;), por lo que no puedo usar el graphics.Clear() y BackColor()

Aquí una Muestra de la Imagen sin el Refresh():

Cómo dibujar una sola línea usando el Evento MouseMove

Aquí está mi código:

private void panel1_MouseMove(object sender, MouseEventArgs e)
{  
   Graphics g = panel1.CreateGraphics();

   g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
   using (var p = new Pen(Color.Black, 3))
   {
      p.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
      p.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;

      g.DrawLine(p, st, e.Location);
   }
   Thread.Sleep(30);
   Invalidate();
   //this.Refresh();

   g.Dispose();
}

Que respecta a

InformationsquelleAutor Rye | 2010-09-15

5 Comentarios

  1. 3

    Las siguientes obras para mí. Básicamente, mantener un registro de la última línea que se dibuja y dibuja con el color de fondo del panel (le da el efecto de la compensación es).

       public partial class Form1 : Form
       {
          public Form1()
          {
             InitializeComponent();
          }
    
          private const int PEN_WIDTH = 3;
          private const LineCap START_CAP = LineCap.ArrowAnchor;
          private const LineCap END_CAP = LineCap.ArrowAnchor;
          Point mAnchorPoint = new Point(10, 10);
          Point mPreviousPoint = Point.Empty;
    
          private void panel1_MouseMove(object sender, MouseEventArgs e)
          {
             using (Graphics g = panel1.CreateGraphics())
             {
                //Clear last line drawn
                using (Pen clear_pen = new Pen(panel1.BackColor, PEN_WIDTH))
                {
                   clear_pen.StartCap = START_CAP;
                   clear_pen.EndCap = END_CAP;
                   g.DrawLine(clear_pen, mAnchorPoint, mPreviousPoint);
                }
    
                //Update previous point
                mPreviousPoint = e.Location;
    
                //Draw the new line
                using (Pen draw_pen = new Pen(Color.Black, PEN_WIDTH))
                {
                   draw_pen.StartCap = START_CAP;
                   draw_pen.EndCap = END_CAP;
                   g.DrawLine(draw_pen, mAnchorPoint, e.Location);
                }
             }
          }
       }

    Si color de fondo del panel es Transparente, usted tendrá que cambiar panel1.BackColor a panel1.Parent.BackColor

    Si el Panel Transparente no funciona, usted podría utilizar el DrawReversibleLine función (aunque esto no permite que el color o el grosor de la línea para ser cambiado, no debería tener problemas con el dibujo/borrado, incluso si el panel es Transparente:

      Point mAnchorPoint = new Point(200, 200);
      Point mPreviousPoint = Point.Empty;
    
      private void panel1_MouseMove(object sender, MouseEventArgs e)
      {
         if (mPreviousPoint != Point.Empty)
         {
            //Clear last line drawn
            ControlPaint.DrawReversibleLine(PointToScreen(mAnchorPoint), PointToScreen(mPreviousPoint), Color.Pink);
         }
    
         //Update previous point
         mPreviousPoint = e.Location;
         mPreviousPoint.Offset(myPanel1.Location);
    
         //Draw the new line
         ControlPaint.DrawReversibleLine(PointToScreen(mAnchorPoint), PointToScreen(mPreviousPoint), Color.Pink);
      }
    • ah, sí, esto va a funcionar bien. Pero estoy usando un panel transparente(CreateParams.ExStyle |= 0x20;).
    • Acabo de ver tus comentarios. Usted puede utilizar panel1.Parent.BackColor
    • panel1 principal es la forma. El panel transparente parpadea en blanco. cuando he usado panel1.Parent.BackColor
    • Actualizado mi respuesta con un enfoque diferente
    • Oh! sí, el drawreversible línea. Se me olvidaba. Esperar lo voy a intentar.
    • Guardar el día @SwDevMan81. Me olvidé de que los theres un DrawReversibleLine() método. Gracias!
    • No prob, me alegra poder ayudar

  2. 3

    Otra manera sencilla de dibujar una línea con el ratón en C#:

    public partial class Form1 : Form
    {
        Options_c o = new Options_c();
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            o.Allow = false;
    
        }
    
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            o.Allow = true;
            o.X = e.X;
            o.Y = e.Y;
        }
    
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (o.Allow == true)
            {
                Graphics g = pictureBox1.CreateGraphics();
                Pen p1 = new Pen(o.color, 5);
                g.DrawLine(p1, o.X,o.Y, e.X, e.Y);
                o.X = e.X;
                o.Y = e.Y;
            }
        }
    }
    
    class Options_c
    {
        public Boolean Allow = false;
        public Int32 X;
        public Int32 Y;
        public Color color = Color.Bisque;
    }
    • Bienvenido a Desbordamiento de Pila! En lugar de sólo publicar un bloque de código, por favor explique ¿por qué este código resuelve el problema planteado. Sin una explicación, esto no es una respuesta.
    • usted tiene que deshacerse de g y de la pluma.
  3. 0

    Después de

    g.DrawLine(p, st, e.Location); 

    poner:

    st = e.Location;

    Hace que solucionar el problema?

    • Nope, solo crea una nueva línea.
    • Oh, a la derecha. Pensé que estaba tratando de dibujar como un lápiz. Ahora veo que usted desea tener un único punto de partida y de ser capaz de mover el punto final en torno a tener que redibujar una sola línea entre el punto de inicio y el nuevo punto final.
    • Sí @BoltBait eso es correcto.
  4. 0

    El problema con la línea de desaparecer es que cuando el panel está pintado, la línea no se vuelve a dibujar. Lo que realmente necesitas es actualizar el punto final de la línea de segmento cuando el ratón se mueve a través del panel y a invalidar el panel. Por supuesto, esto significa que usted hacer manejar el Paint evento en el panel.

    Código aquí, sin el controlador de eventos de inscripción:

    Point endPoint;
    
    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    
        using (var p = new Pen(Color.Black, 3))
        {
            p.StartCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
            p.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
    
            g.DrawLine(p, st, endPoint);
        }
    
        Thread.Sleep(30);
    }
    
    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        endPoint = e.Location;
        panel1.Invalidate();
    }
    • la g.Clear() es buena. Pero se me olvidó incluir que hay que anular un panel de control de usuario con CreateParams. Por lo que el panel es transparente. es por eso que no puedo utilizar el g.Clear();
    • Bien. Pero, ¿por qué no puede usted manejar la Paint evento? Esa es la manera más fácil.
    • Sólo quiero la línea como un marcador.
    • Puede usted explicar lo que eso significa?
    • Tengo un Panel transparente. Se coloca encima de una imagen(e.g picturebox), Esta imagen contiene dibujos de línea. Sólo quiero medir los dibujos con el drawline en MouseMove() evento.
  5. 0

    OKaie, lo tengo! Si usted tiene que dibujar una línea entre dos geopoint
    ubicación en tocuhing estos dos ubicación, entonces u tiene que utilizar el
    superposición de clase en esta forma… MI CÓDIGO ES :

    en la actividad Principal de escribir este código también:

              public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mapView = (MapView) findViewById(R.id.mapView1);            
    mapView.setBuiltInZoomControls(true);
    mapOverlays = mapView.getOverlays();//it get the mapview all overlays...
    mc = mapView.getController();
    mc.setZoom(13);
    GeoPoint p = new GeoPoint(34159000,73220000);//starting point Abbottabad    
    GeoPoint p1 = new GeoPoint(41159000,43220000);//starting point Abbottabad   
    List<Overlay> mapOverlays2 ;
    mapOverlays2 = mapView.getOverlays();
    projection = mapView.getProjection();  
    myoverlay = new MarkerOverlay(p,p1);
    mapOverlays2.add(myoverlay);//*/
    }
    class MarkerOverlay extends Overlay
    { 
    GeoPoint p,p1;
    private GeoPoint pa;
    public MarkerOverlay(GeoPoint p,GeoPoint p1)
    {  
    this.p = p;
    this.p1=p1;
    Toast.makeText(GoogleMapShowActivity.this, "point value is "+p +"-->"+p1, Toast.LENGTH_LONG).show();
    }
    public void draw(Canvas canvas, MapView mapView,boolean shadow)//), long when)
    {
    super.draw(canvas, mapView, shadow);                   
    Paint mPaint = new Paint(); 
    mPaint.setDither(true);    
    mPaint.setColor(Color.RED);    
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE);  
    mPaint.setStrokeJoin(Paint.Join.ROUND);    
    mPaint.setStrokeCap(Paint.Cap.ROUND);  
    mPaint.setStrokeWidth(4); 
    GeoPoint gP1 = new GeoPoint(p.getLatitudeE6(),p.getLongitudeE6());//starting point Abbottabad  
    GeoPoint gP2 = new GeoPoint(p1.getLatitudeE6(),p1.getLongitudeE6());//(33695043,73050000);//End point Islamabad            
    Point p1 = new Point();    
    Point p2 = new Point();
    Path path1 = new Path();               
    projection.toPixels(gP1, p1);  //changing the latitude into the screen pixels.
    projection.toPixels(gP2, p2);  
    path1.moveTo(p1.x, p1.y);//Moving to Abbottabad location
    path1.lineTo(p2.x,p2.y);//Path till Islamabad  
    canvas.drawPath(path1, mPaint);//Actually drawing the path from Abbottabad to Islamabad
    }
    //--------------------------//
    public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    {
    location_touch++;//this is called two times before executing other codes in thsi method(), 
    //Toast.makeText(GoogleMapShowActivity.this, "this is mmmm"+location_touch, Toast.LENGTH_LONG).show();
    if (event.getAction() == 1)
    {
    //Toast.makeText(GoogleMapShowActivity.this, "this is me ..."+location_touch, Toast.LENGTH_LONG).show();
    GeoPoint p = mapView.getProjection().fromPixels((int) event.getX(), (int) event.getY());
    if((location_touch%2)!=0)
    {
    location_touch=0;
    Toast.makeText(GoogleMapShowActivity.this, "VALUE 2..."+location_touch+"gp is "+p+",,"+p1, Toast.LENGTH_LONG).show();
    mapView.getOverlays().add(new MarkerOverlay(p,pa));
    mapView.invalidate();
    }
    else //if((location_touch==0 ))
    {
    pa=p;
    Toast.makeText(GoogleMapShowActivity.this, "VALUE 1.."+location_touch+",,,"+p1, Toast.LENGTH_LONG).show();
    location_touch++;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here