我正在尝试在c#中创建这个简单的应用程序:当用户双击表单中的特定位置时,将绘制一个小圆圈。只需点击一下,如果当前位置标有圆圈,则该圆圈将被移除。
我试图通过简单地注册MouseDoubleClick和MouseClick事件来做到这一点,并通过以下方式从.bmp文件中绘制圆圈:
private void MouseDoubleClick (object sender, MouseEventArgs e)
{
Graphics g = this.CreateGraphics();
Bitmap myImage = (Bitmap)Bitmap.FromFile("Circle.bmp");
g.DrawImage(myImage, e.X, e.Y);
}
我的问题是,当用户点击其位置时,我不知道如何使圈子不可见:我知道如何检查所选位置是否包含圆圈(通过管理所有位置包含圈子的列表...) ,但我不知道如何删除它。
另一个问题:每当用户双击一个位置时,我应该调用this.CreateGraphics()方法,就像我在我的代码片段中写的那样,或者我应该在初始化时调用它一次吗?
答案 0 :(得分:2)
我个人的偏好是将我的图片放在Picturebox
课程的实例中。原因是,我可以简单地调用每个Picturebox的Hide()
函数(或将'Visible`设置为false)。
你正在做的是将直接绘制到窗口的客户区,这在技术上没有错,但通常应该在表单的Paint处理程序中完成。如果在某些时候你决定不再让你的圆圈可见,你可以调用表格的Invalidate()
方法来触发Paint事件。在那里,你明确地不绘制你的圆圈,因此对于用户来说,圆圈消失了。
关于Picturebox的好处在于它是持久的 - 你将图像放入其中并可选择在该图像上绘制,但你只需要绘制一次。如果使用Paint处理程序技术,则每次表单需要重绘时都会调用绘图代码。
修改强>
以下是一些说明我的Paint处理程序信息的代码:
private void Form_Paint(object sender, PaintEventArgs e)
{
e.Graphics.Clear(); // clear any and all circles being drawn
if (CircleIsVisible)
{
e.Graphics.DrawEllipse( ... ); // OR, DrawImage( ) as in your example
}
}
private void MouseDoubleClick (object sender, MouseEventArgs e)
{
CircleIsVisible = true;
Invalidate(); // triggers Paint event
}
如果您正在绘制位图,我会加载位图一次并将其存储为类变量。这样,每次想要绘制时都不需要点击硬盘。处理您的类(在本例中为您的窗口)时处理位图。
答案 1 :(得分:0)
我认为你应该在下次双击之前清除你绘制的所有图像
如Graphics.Clear()。
另一方面,您不应该每次都创建Graphics对象或处置它。
答案 2 :(得分:0)
如果您有简单的背景颜色,可以使用Graphics.DrawEllipse绘制圆圈,然后只需将圆形颜色更改为背景颜色。此外,您还需要绘制所有圆圈的集合,以便访问您绘制的任何圆圈。