这为什么不画任何东西?
我已经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每次我点击。在第二次点击时,应在两个坐标之间绘制一条线。 虽然这并不工作,我不明白为什么。有人能告诉我什么是错的吗?
您的代码有两个主要问题。
首先,您在窗体上调用CreateGraphics
,而不是图片框 - 所以如果您确实画到了正确的位置,绘图将被图片框隐藏。
其次,你的坐标已关闭,因为Cursor.Position
返回屏幕坐标,而不是相对于正在绘制的控件的坐标。但这已经是不必要的 - 你不应该首先使用Click
事件,而应该使用MouseUp
。 Click
是一种不同的动作,其根本不需要涉及定位设备(例如按下按钮上的空间)。你想要处理鼠标点击,所以使用鼠标事件。作为奖励,你会得到在事件处理程序的参数点击本地coördinates:)
最后,如果你想让图像持久,我建议不直接绘制到图片框图形对象,而是创建一个内存中的位图来保存图形,并让图片框根据需要进行重新绘制。否则,任何导致画框重画的东西都将清除你所画的任何东西。
您应该在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来存储坐标,因为这会将坐标保存在逻辑组中,并使其更清晰。
如果你这样做,一旦捕获了co?rinates,而不是在'Paint'事件中,就执行'PointToClient'。在此期间,控制权可能已经移动,这将使线路移动。 – Luaan
'radioButtonDrawLine.Checked == true?' –
仍然不起作用。我认为它应该是相同的,而不使用“== true” –