2017-02-22 93 views
-3

我已经if语句在我的代码如下:这为什么不画任何东西?

//global variables 
int x1; 
int y1; 
int x2; 
int y2; 
int counter = 0; 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (radioButtonDrawLine.Checked) 
    { 
     if (counter == 0) 
     { 
      x1 = Cursor.Position.X; 
      y1 = Cursor.Position.Y; 
      counter++;       
     }  
     else 
     { 
      x2 = Cursor.Position.X; 
      y2 = Cursor.Position.Y; 

      if (counter == 1) 
      { 
       Graphics g = CreateGraphics(); 
       g.DrawLine(Pens.Black, x2, y2, x1, y1); 
      } 
      counter = 0; 
     } 
    } 
} 

我应该在我的PictureBox点击两次,并将其保存在x和y每次我点击。在第二次点击时,应在两个坐标之间绘制一条线。 虽然这并不工作,我不明白为什么。有人能告诉我什么是错的吗?

+1

'radioButtonDrawLine.Checked == true?' –

+0

仍然不起作用。我认为它应该是相同的,而不使用“== true” –

回答

3

您的代码有两个主要问题。

首先,您在窗体上调用CreateGraphics,而不是图片框 - 所以如果您确实画到了正确的位置,绘图将被图片框隐藏。

其次,你的坐标已关闭,因为Cursor.Position返回屏幕坐标,而不是相对于正在绘制的控件的坐标。但这已经是不必要的 - 你不应该首先使用Click事件,而应该使用MouseUpClick是一种不同的动作,其根本不需要涉及定位设备(例如按下按钮上的空间)。你想要处理鼠标点击,所以使用鼠标事件。作为奖励,你会得到在事件处理程序的参数点击本地coördinates:)

最后,如果你想让图像持久,我建议不直接绘制到图片框图形对象,而是创建一个内存中的位图来保存图形,并让图片框根据需要进行重新绘制。否则,任何导致画框重画的东西都将清除你所画的任何东西。

2

您应该在Paint事件中执行绘图。像下面的东西应该工作:

//global variables 
private Point? p1; 
private Point? p2; 
private int counter = 0; 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (radioButtonDrawLine.Checked) 
    { 
     if (counter == 0) 
     { 
      p1 = pictureBox1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
      counter++; 
     } 
     else 
     { 
      p2 = pictureBox1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
      pictureBox1.Refresh(); 
      counter = 0; 
     } 
    } 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (p1.HasValue && p2.HasValue) 
    { 
     e.Graphics.DrawLine(Pens.Black, p1.Value.X, p1.Value.Y, p2.Value.X, p2.Value.Y); 
    } 
} 

pictureBox1.Refresh()电话是迫使一旦第二点已经创造了一个重​​绘。请注意,我也使用Point结构而不是ints来存储坐标,因为这会将坐标保存在逻辑组中,并使其更清晰。

+0

如果你这样做,一旦捕获了co?rinates,而不是在'Paint'事件中,就执行'PointToClient'。在此期间,控制权可能已经移动,这将使线路移动。 – Luaan

相关问题