2011-12-14 47 views
1

我有一个图片框。 在图片框我使用画线:如何在GDI中移动缩放线+

gfx.DrawLine(nPen, line.xBegin, line.yBegin, line.xEnd, line.yEnd);

line是包含开头的行值和结束值的对象。

我在那个图片框上绘制10行。 我MOUSE_WHEEL监听器包含代码:

gfx.TranslateTransform((panelpreview.Width)/2, (panelpreview.Height)/2); 
gfx.ScaleTransform(imageScale, imageScale); 
gfx.TranslateTransform(-(panelpreview.Width)/2, -(panelpreview.Height)/2); 

目前我试图通过移动线:

private void panelPreview_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      checkLinesIntersection(e.Location); //checks if e.Location intersects with the line 
      panelPreview.MouseUp += new MouseEventHandler(panelPreview_MouseUpLine); 
      panelPreview.MouseMove += new MouseEventHandler(panelPreview_MouseMoveLine); 
     } 
    } 

    void panelPreview_MouseMoveLine(object sender, MouseEventArgs e) 
    { 
     if (_Leading.movable) 
      newFont.Leading = e.Y - (_base.yBegin + newFont._descenderHeight); 

     if (_xHeight.movable) 
      if (_base.yBegin - e.Y >= 0) 
       newFont.xHeight = _base.yBegin - e.Y; 

     if (_capHeight.movable) 
      if (_base.yBegin - e.Y >= 0) 
       newFont.capHeight = _base.yBegin - e.Y; 

     if (_ascenderHeight.movable) 
      if (_base.yBegin - e.Y >= 0) 
       newFont.ascenderHeight = _base.yBegin - e.Y; 

     if (_descenderHeight.movable) 
      if (e.Y - _base.yBegin >= 0) 
       newFont.descenderHeight = e.Y - _base.yBegin; 

     UpdatePreviewWindow(); 
    } 

    void panelPreview_MouseUpLine(object sender, MouseEventArgs e) 
    { 
     panelPreview.MouseMove -= new MouseEventHandler(panelPreview_MouseMoveLine); 
     panelPreview.MouseUp -= new MouseEventHandler(panelPreview_MouseUpLine); 
    } 

的问题是,上线的,即使在视觉上我按缩放后的未反应的它应该的方式。

public void checkLinesIntersection(Point mouseLocation) 
    { 
     lineIntersects(_Leading, mouseLocation); 
     lineIntersects(_xHeight, mouseLocation); 
    } 

    private void lineIntersects(nLine line, Point mouseLocation) 
    { 
     if (mouseLocation.X >= line.xBegin && mouseLocation.X <= line.xEnd) 
      if (mouseLocation.Y >= line.yBegin || mouseLocation.Y + 2 >= line.yBegin) 
       if (mouseLocation.Y <= line.yEnd || mouseLocation.Y - 2 <= line.yEnd) 
        switch (line.sName) 
        { 
         case "xHeight": 
          newFont.selectedLine = nFont.Lines._xHeight; 
          break; 
         default: 
          break; 
        } 
    } 
+0

我的水晶球看不到checkLinesIntersection() – 2011-12-14 12:47:19

回答

0

因此!在这个工具上工作了一段时间后,我改变了方法,并使用XNA来处理图形(绘图,缩放,移动绘制对象)。 对XNA的使用CameraMatrix进行转换的帮助很大。 ANYWAY!我不会发布我的XNA解决方案来处理这个问题,但通过使用XNA,我发现了在WinForms中处理它的方法。

float Zoom = 1f; 
Microsoft.Xna.Framework.Rectangle mouseRect; 
Matrix inverse; 

void TAB_PICTURE_BOX_MouseWheel(object sender, MouseEventArgs e) 
    { 
     try 
     { 
      if (e.Delta > 0) 
      { 
       Zoom+= .1f; 
      } 
      if (e.Delta < 0) 
      { 
       Zoom -= .1f; 
      } 

      gfx.ResetTransform(); 
      gfx.TranslateTransform((Width + img.Width)/2, (Height - img.Height)/2); 
      gfx.ScaleTransform(Zoom, Zoom); 
      gfx.TranslateTransform(-(Width + img.Width)/2, -(Height - img.Height)/2);  
       getInversePosition(e); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

,最终触摸getInversePosition(e);方法:

private void getInversePosition(MouseEventArgs e) 
    { 
     Matrix matrix = Matrix.CreateTranslation(new Vector3(-(Width + img.Width)/2, -(Height - img.Height)/2, 0)) * 
        Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) * 
        Matrix.CreateTranslation(new Vector3((Width + img.Width)/2, (Height - img.Height)/2, 0)); 

     inverse = Matrix.Invert(matrix); 
     Vector2 mousePosition = Vector2.Transform(new Vector2(e.X, e.Y), inverse); 
     mouseRect = new Microsoft.Xna.Framework.Rectangle((int)mousePosition.X, (int)mousePosition.Y, 1, 1); 
    } 

我相信,有一种方法来处理它,而不XNA参与,但在我的情况做XNA的工作。