绘图中的位图无法在 Load_Form 之外渲染

Bitmap from Drawing not render outside of Load_Form

我正在尝试将绘图创建的位图渲染到屏幕上,但仅在最小化并再次最大化后才渲染。

我遵循以下步骤:Using Bitmaps for Persistent Graphics in C#

但只能在 Load_Form 以外的屏幕中渲染位图。

如果我输入代码:

using System.Drawing;
...

Graphics graphicsObj;
myBitmap = new Bitmap(this.ClientRectangle.Width, 
        this.ClientRectangle.Height, 
        Imaging.PixelFormat.Format24bppRgb);
graphicsObj = Graphics.FromImage(myBitmap);

Pen myPen = new Pen(Color.Plum, 3);
Rectangle rectangleObj = new Rectangle(10, 10, 200, 200);
graphicsObj.DrawEllipse(myPen, rectangleObj);
graphicsObj.Dispose();

在其他地方,例如按钮,我需要最小化和最大化才能看到图像。

编辑:

bmp 是一个 Bitmap 全局变量 我在表单事件 Load_Form1[ 中创建了一个实例=37=]

bmp = new Bitmap(this.ClientRectangle.Width,
                 this.ClientRectangle.Height,
                 System.Drawing.Imaging.PixelFormat.Format24bppRgb);

用于重绘的窗体绘制事件:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics graphicsObj = e.Graphics;
    graphicsObj.DrawImage(myBitmap, 0, 0, myBitmap.Width, myBitmap.Height);
    graphicsObj.Dispose();
}

但是我需要在创建图纸后立即绘制。

没有告诉我们大局,因此很难推荐最佳行动方案,但让我简单地假设两个可能的目标:

  • 要么你只是想在表单上绘制一些东西

  • 或者您想显示一个位图,您可以在其中连续绘制越来越多的东西。

首先,您需要像这样编写 Paint 事件代码:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Rectangle rectangleObj = new Rectangle(10, 10, 200, 200);
    using (Pen myPen = new Pen(Color.Plum, 3))
      e.Graphics.DrawEllipse(myPen, rectangleObj);
}

如果控制绘图的数据是动态的,您应该将它们存储在 class 级变量或它们的列表中,并根据需要更改它们,以便您可以在 Paint 事件中使用它们。

对于后一个目标,您将在不同的时间添加到位图。

所以你首先创建一个可能 class 级别 Bitmap:

    public Form1()
    {
        InitializeComponent();
        bmp = new Bitmap(this.ClientRectangle.Width,
                         this.ClientRectangle.Height);         
    }

    Bitmap bmp = null;

并且有一个或多个地方可以像这样吸引它:

void drawALittle()
{
    Rectangle rectangleObj = new Rectangle(10, 10, 200, 200);
    using (Pen myPen = new Pen(Color.Plum, 3))
    using (Graphics G = Graphics.FromImage(bmp))
    {
        G.DrawEllipse(myPen, rectangleObj);
        //..
    }
    this.Invalidate();
}

请注意我如何在更改 BitmapInvalidate Form,因此触发了 Paint 事件。

另请注意,如果这些更新确实经常发生,最好在两次调用之间保持 Graphics 对象处于活动状态;通过使它成为像位图一样的 class 变量,或者将它保存在执行所有更新的方法中并将其作为参数传递给绘图方法..

在表单的 Paint 事件中,您只需要

private void Form1_Paint(object sender, PaintEventArgs e)
{
      e.Graphics.DrawImage(bmp, 0, 0);
}       

另请注意,32bppARGB 是推荐的默认格式。 Is 用于任何情况下显示的任何内容,因此最有效的方法是使用它开始..