Drawing中的位图不能在Load_Form之外渲染

时间:2015-04-26 06:59:01

标签: c# .net bitmap drawing system.drawing

我尝试渲染从绘图到屏幕创建的位图,但只在最小化后再渲染并再次最大化。

我按照以下步骤操作: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 位图全局变量我在表单事件 Load_Form1

中创建实例
bmp = new Bitmap(this.ClientRectangle.Width,
                 this.ClientRectangle.Height,
                 System.Drawing.Imaging.PixelFormat.Format24bppRgb);

用于重绘的Form的事件:

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

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

1 个答案:

答案 0 :(得分:1)

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

  • 要么只是想要绘制在表格上的东西

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

首先,您需要的是对public NewTaskViewModel() { ButtonClick = new ButtonCommandBinding(SendTask); ButtonClick.IsEnabled = true; Projects = new CollectionView(this.GetProjects()); Projects.CurrentChanged += new EventHandler(projects_CurrentChanged); } void projects_CurrentChanged(object sender, EventArgs e) { this.Tasks = new CollectionView(this.GetTaskLists()); Users = new CollectionView(this.GetProjectAssignedUsers()); } public IEnumerable<Api.TaskList> GetTaskLists() { var tasksLists = connection.GetTaskLists(this.SelectedProject.Id); return tasksLists; } 事件进行编码,如下所示:

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); } 事件中使用它们。

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

因此,您首先要创建一个类级别Paint

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(); } 后我Invalidate Form的方式,以便触发Bitmap事件。

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

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

Paint

另请注意,private void Form1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(bmp, 0, 0); } 是推荐的默认格式。 Is用于任何情况下显示的任何内容,因此使用它开始时效率最高..