首页 > 解决方案 > 绘制矩形覆盖现有位图 c#

问题描述

我有一个已经绘制到图片框的网格,我希望在单击鼠标的单元格中绘制一个矩形。我试图通过在单元格的左上角绘制一个矩形并让它填充整个细胞。然而,当我点击网格消失。我怎样才能让它保持网格?

有没有明显更好的方法来做到这一点?

重新绘制网格的唯一方法是再次按下按钮,但我希​​望它留在那里。谢谢。

在此处输入图像描述

标签: c#winformsgraphics

解决方案


在 mouse_click 事件中的每次鼠标单击时,首先您会处理图片框的图像,然后再次将位图分配给图片框图像,否则如果您单击网格太多次,您可能会遇到内存不足异常

private void InitializePictureBoxImage(PictureBox pictureBox)
{
    if(pictureBox.Image != null)
    {
          var image = pictureBox.Image;  // cache it to dispose
          pictureBox.Image = null;  // don't dispose an used object
          image.Dispose();   // and dispose of it
    }

    Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
    pictureBox.Image = bitmap;  // assign bitmap to image
}
    

然后在单击表单中的“生成网格”按钮时调用用于绘制图片框的 mouse_click 事件中的方法。然后使用 mouse_click 事件中的图形为您按下的网格着色,并从 MouseEventArgs 获取 XY 坐标。

总而言之,我认为它会是这样的

private void Mouse_ClickEvent(object sender, MouseEventArgs e)
{
    InitializePictureBoxImage(pictureBox);
    DrawThePictureBoxImage(pictureBox);

    using (Graphics graphics = Graphics.FromImage(pictureBox.Image))
    {
       Color color = Color.Blue;
       color = Color.FromArgb(150, color.R, color.G, color.B);  // lower the opacity so the writing in the grid is visible
       var brush = new SolidBrush(color);
       
       // Calculate the starting X-Y coordinate and Width,Height of the grid to color

       graphics.FillRectangle(brush, startX, startY,
                    width, height);
    }

推荐阅读