繁体   English   中英

绘图矩形覆盖现有 bitmap c#

[英]Drawing rectangle is overwriting existing bitmap c#

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

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

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

在此处输入图像描述

您需要创建一个图形

Image bm;// Or Bitmap
            
using (var graphics = Graphics.FromImage(bm))
{
    Draw(rects, graphics);              
}

private static void Draw(List<Rectangle> rectangles, Graphics graphics)
{
    Pen redPen = new Pen(Color.Red, 1);
    foreach (var rect in rectangles)
    {
        graphics.DrawRectangle(redPen, rect);
    }
}

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

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);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM