我尝试渲染从绘图到屏幕创建的位图,但只在最小化后再渲染并再次最大化。
我按照以下步骤操作: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();
}
但是我需要在创建绘图后立即绘制。
答案 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用于任何情况下显示的任何内容,因此使用它开始时效率最高..