2010-11-30 4 views
3

Ich versuche, eine Leinwand zum Zeichnen verschiedener Objekte zu erstellen. Ich habe Zoom- und Schwenkfunktionen mit graphics.scaleTransform und graphics.translateTransform erstellt, aber ich möchte den Canvas-Hintergrund (ein Raster) immer das gesamte Fenster ausfüllen, jedoch nicht mit folgendem Code:Wie zeichne ich irgendwo in einem Grafikobjekt nach der Transformation

EDIT: Ich habe versucht, die Koordinaten im transformierten Grafikobjekt zu verwenden, aber es scheint, dass es keine negativen Zahlen akzeptiert?!?

EDIT: Dieses Bild erklärt mein Problem:

alt text

public partial class Form1 : Form 
     { 

      PointF mouseDown; 

      float newX; 
      float newY; 
      float zoomFactor = 1F; 

      Region _rgn; 
      Graphics _dc; 
      PointF zoomPoint = new PointF(150, 150); 

      public Form1() 
      { 
       InitializeComponent(); 

       mouseDown = new PointF(0F, 0F); 

       this.panel1.Paint += new PaintEventHandler(panel1_Paint); 
       this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(panel1_MouseDown); 
       this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(panel1_MouseMove); 

      } 



      private void panel1_Paint(object sender, PaintEventArgs e) 
      { 

       base.OnPaint(e); 

       //Graphics bg = 

       Graphics dc = e.Graphics; 
       _dc = dc; 

       dc.SmoothingMode = SmoothingMode.AntiAlias; 

Color gridColor = Color.FromArgb(230, 230, 230); 
      Pen gridPen = new Pen(gridColor, 1); 

      for (float i = 0; i < this.Height * (zoomFactor); i = i + 30*zoomFactor) 
      { 
       dc.DrawLine(gridPen, 0, i, this.Width * (zoomFactor), i); 
      } 
      for (float i = 0; i < this.Width * (zoomFactor); i = i + 30*zoomFactor) 
      { 
       dc.DrawLine(gridPen, i, 0, i, this.Height * (zoomFactor)); 
      } 

       dc.TranslateTransform(newX, newY); 
       dc.ScaleTransform(zoomFactor, zoomFactor, MatrixOrder.Prepend); 



       float XPosition = 10; 
       float YPosition = 10; 
       float CornerRadius = 5; 
       float Width = 50; 
       float Height = 50; 

       Color BoxColor = Color.FromArgb(0, 0, 0); 
       Pen BoxPen = new Pen(BoxColor, 2); 

       GraphicsPath Path = new GraphicsPath(); 

       Path.AddLine(XPosition + CornerRadius, YPosition, XPosition + Width - (CornerRadius * 2), YPosition); 
       Path.AddArc(XPosition + Width - (CornerRadius * 2), YPosition, CornerRadius * 2, CornerRadius * 2, 270, 90); 
       Path.AddLine(XPosition + Width, YPosition + CornerRadius, XPosition + Width, YPosition + Height - (CornerRadius * 2)); 
       Path.AddArc(XPosition + Width - (CornerRadius * 2), YPosition + Height - (CornerRadius * 2), CornerRadius * 2, CornerRadius * 2, 0, 90); 
       Path.AddLine(XPosition + Width - (CornerRadius * 2), YPosition + Height, XPosition + CornerRadius, YPosition + Height); 
       Path.AddArc(XPosition, YPosition + Height - (CornerRadius * 2), CornerRadius * 2, CornerRadius * 2, 90, 90); 
       Path.AddLine(XPosition, YPosition + Height - (CornerRadius * 2), XPosition, YPosition + CornerRadius); 
       Path.AddArc(XPosition, YPosition, CornerRadius * 2, CornerRadius * 2, 180, 90); 

       Path.CloseFigure(); 



       LinearGradientBrush lgb = new LinearGradientBrush(new PointF(XPosition+(Width/2),YPosition), new PointF(XPosition+(Width/2),YPosition + Height), Color.RosyBrown, Color.Red); 

       dc.FillPath(lgb, Path); 


       dc.DrawPath(BoxPen, Path); 

       Matrix transformMatrix = new Matrix(); 
       transformMatrix.Translate(newX, newY); 
       transformMatrix.Scale(zoomFactor, zoomFactor); 

       _rgn = new Region(Path); 

       _rgn.Transform(transformMatrix); 

      } 

      private void panel1_MouseDown(object sender, EventArgs e) 
      { 
       MouseEventArgs mouse = e as MouseEventArgs; 

       if (mouse.Button == MouseButtons.Right) 
       { 

        mouseDown = mouse.Location; 

        mouseDown.X = mouseDown.X - newX; 
        mouseDown.Y = mouseDown.Y - newY; 

       } 

       else if (mouse.Button == MouseButtons.Left) 
       { 

        if (_rgn.IsVisible(mouse.Location, _dc)) 
        { 
         MessageBox.Show("tada"); 
        } 


       } 

      } 

      private void panel1_MouseMove(object sender, EventArgs e) 
      { 
       MouseEventArgs mouse = e as MouseEventArgs; 

       if (mouse.Button == MouseButtons.Right) 
       { 
        PointF mousePosNow = mouse.Location; 

        float deltaX = mousePosNow.X - mouseDown.X; 
        float deltaY = mousePosNow.Y - mouseDown.Y; 

        newX = deltaX; 
        newY = deltaY; 

        panel1.Invalidate(); 

       } 


      } 

      protected override void OnMouseWheel(MouseEventArgs e) 
      { 

       MouseEventArgs mouse = e as MouseEventArgs; 

       PointF mP = mouse.Location; 

       if (e.Delta > 0) 
       { 
        if (zoomFactor >= 1 && zoomFactor <= 10) 
        { 
         zoomFactor += 1F; 

         newX = newX - ((mP.X - newX)/(zoomFactor - 1)); 
         newY = newY - ((mP.Y - newY)/(zoomFactor - 1)); 
        } 
        else if (zoomFactor == 0.5) 
        { 
         zoomFactor = zoomFactor * 2; 
         newX = 2 * newX - mP.X ; 
         newY = 2 * newY - mP.Y ; 
        } 
        else if (zoomFactor < 0.5) 
        { 
         zoomFactor = zoomFactor * 2; 
         newX = 2 * newX - mP.X; 
         newY = 2 * newY - mP.Y; 
        } 
       } 

       else if (e.Delta < 0) 
       { 
        if (zoomFactor >2) 
        { 
         zoomFactor -= 1F; 
         newX = newX + (((mP.X - newX))/(zoomFactor+1)); 
         newY = newY + (((mP.Y - newY))/(zoomFactor+1)); 
        } 
        else if (zoomFactor == 2) { 
         zoomFactor -= 1F; 

         newX = newX + ((mP.X - newX)/2); 
         newY = newY + ((mP.Y - newY)/2); 
        }else if(zoomFactor <= 1 && zoomFactor > 0.2) 
        { 
         zoomFactor = zoomFactor/2; 

         newX = newX + ((mP.X - newX)/2); 
         newY = newY + ((mP.Y - newY)/2); 

        } 


       } 

       panel1.Invalidate(); 

      } 
     } 
+0

+1 für die Bearbeitung im Bild zu ersetzen. –

Antwort

2

Zeichnen Sie Ihre GRID, BEVOR Sie das Koordinatensystem zu transformieren.

Wenn Sie nicht können, verwenden Sie GetTransform() und ResetTransform(), dann zeichnen Gitter, dann SetTransform zurück (der im ersten Schritt).

IMHO: Es wäre viel besser, wenn Sie Bild 'manuell' skalieren, anstatt Koordinatentransformation zu verwenden. Sie werden auf diese Weise viel mehr Kontrolle haben und nicht mit irgendetwas an die Wand gehen.

EDIT:

auch: Sie haben einen Fehler in Ihrem Raster Zeichenroutine:

for (float i = 0; i < this.Height * (zoomFactor); i = i + 30*zoomFactor) 

versuchen mit

for (float i = 0; i < this.Height; i = i + 30*zoomFactor) 
+0

@Daniel - was meinst du mit manueller Skalierung? dass ich das einzelne Objekt auf der Leinwand skaliere? – Bildsoe

+0

@Daniel - Oh, und ich zeichne das Raster vor der Skalierung, aber wenn ich es verkleinere, ist es nicht groß genug, besonders wenn ich sowohl zoome und schwenken. – Bildsoe

+0

ja, skalieren und verschieben Sie sie manuell. was meinst du - nicht groß genug? Außerdem scheint es, dass Sie aus Ihrem Code kein Gitter vor der Transformation zeichnen ... vielleicht, wenn Sie ein Bild von "SO WIE ICH ES WOLLTE" und "DAS IST WIE ES JETZT IST" –

Verwandte Themen