控制.NET中Bitmap的可见性

时间:2010-04-17 21:55:29

标签: c# bitmap gdi+

我正在尝试在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()方法,就像我在我的代码片段中写的那样,或者我应该在初始化时调用它一次吗?

3 个答案:

答案 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绘制圆圈,然后只需将圆形颜色更改为背景颜色。此外,您还需要绘制所有圆圈的集合,以便访问您绘制的任何圆圈。