绘图矩形正在覆盖现有位图c#

绘图矩形正在覆盖现有位图c#,c#,winforms,graphics,C#,Winforms,Graphics,我已经在一个picturebox上画了一个网格,我想在鼠标点击的单元格中画一个矩形。我试图通过在单元格的左上角绘制一个矩形来填充整个单元格。 但是,当我单击时,网格将消失。 如何使网格保持不变 有没有明显更好的方法 重新绘制网格的唯一方法是再次按下按钮,但我希望它保持在那里。 谢谢 您需要创建一个图形 Image bm;// Or Bitmap using (var graphics = Graphics.FromImage(bm)) { Draw(rects,

我已经在一个picturebox上画了一个网格,我想在鼠标点击的单元格中画一个矩形。我试图通过在单元格的左上角绘制一个矩形来填充整个单元格。 但是,当我单击时,网格将消失。 如何使网格保持不变

有没有明显更好的方法

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


您需要创建一个图形

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);
    }
}
图像bm;//或位图
使用(var graphics=graphics.FromImage(bm))
{
绘制(矩形、图形);
}
专用静态空心绘制(列表矩形、图形)
{
Pen redPen=新笔(颜色:红色,1);
foreach(矩形中的变量矩形)
{
图形。DrawRectangle(红色笔,矩形);
}
}

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

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
}
    
然后在鼠标单击事件中调用该方法,当您在窗体中按“生成网格”按钮时,该方法用于绘制图片框。然后,使用鼠标单击事件中的图形为按下的网格上色,从鼠标eventargs获取X-Y坐标

总的来说,我认为会是这样

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

因为您使用了
Control.CreateGraphics()
而不是处理控件的绘制事件。顺便说一句,你需要发布你的代码。你想要绘制的所有东西都必须在每次绘画活动中绘制。想必你不会这么做。但是如果没有代码,我们只能猜测。这可能不是他想要的。可能不是:)你能展示一下如何用这个代码填充鼠标点击的一个单元格吗?位图显示在哪里?当你可以在控件的表面上绘制时,为什么你建议在位图中绘制形状?我想他有一个匹配formI中点的网格,我会使用一个矩阵,我会将其转换为图像