欢迎来到老马的领地~ 这是“压风式散热底座”发明者的个人网站:) 本人QQ:80524554,用户群1:562279766
在C#里用图片框绘图想要持久化,不像VB6里那么方便,因为没有提供AutoRedraw了。
常规办法绘好后,一遮挡就成这样了:
那要么就自己管理重绘,这是最好的性能方案,但代码很多。
另一种办法是利用C#里图片框加载图片时会自动重绘的特点来投鸡。。。
简单来说,C#的PictureBox.Image加载的Image/Bitmap对象是可以自动重绘的。
于是就弄一个内存位图给PictureBox加载,然后绘图都在这个内存位图里绘,绘好了再调用Refresh方法更新一下就行。
更新好了后,无论是最小化还是被遮挡之类的情况,图片框会自动保持图像的,也就是类似VB6里的AutoRedraw效果了。
代码方面比较简单,核心如下:
然后绘图都在这个位图对象上绘,绘完后通知图片框更新一下就行了:
很简单的技巧,记一下防止忘了
完整工程代码下载(VS2010):
http://www.m5home.com/blog//uploadfiles/csharp_autoredraw_14613.rar
常规办法绘好后,一遮挡就成这样了:
那要么就自己管理重绘,这是最好的性能方案,但代码很多。
另一种办法是利用C#里图片框加载图片时会自动重绘的特点来投鸡。。。

简单来说,C#的PictureBox.Image加载的Image/Bitmap对象是可以自动重绘的。
于是就弄一个内存位图给PictureBox加载,然后绘图都在这个内存位图里绘,绘好了再调用Refresh方法更新一下就行。
更新好了后,无论是最小化还是被遮挡之类的情况,图片框会自动保持图像的,也就是类似VB6里的AutoRedraw效果了。
代码方面比较简单,核心如下:
Bitmap bmp;
Graphics g;
private void Form1_Load(object sender, EventArgs e)
{ //原理:Image属性加载的图片会自动重绘,于是生成一个内存Bitmap对象赋值给Image属性
// 以后绘图在这个Bitmap对象上绘制,完毕后调用Refresh()让图片框更新一下即可。
bmp = new Bitmap(pictureBox1.Width,pictureBox1.Height); //内存位图
g = Graphics.FromImage(bmp); //关联Graphics对象
pictureBox1.Image = bmp; //图片框图片来源设置为内存位图
}
Graphics g;
private void Form1_Load(object sender, EventArgs e)
{ //原理:Image属性加载的图片会自动重绘,于是生成一个内存Bitmap对象赋值给Image属性
// 以后绘图在这个Bitmap对象上绘制,完毕后调用Refresh()让图片框更新一下即可。
bmp = new Bitmap(pictureBox1.Width,pictureBox1.Height); //内存位图
g = Graphics.FromImage(bmp); //关联Graphics对象
pictureBox1.Image = bmp; //图片框图片来源设置为内存位图
}
然后绘图都在这个位图对象上绘,绘完后通知图片框更新一下就行了:
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 100; i++)
{
x1=rdX1.Next(0, pictureBox1.Width);
y1=rdY1.Next(0, pictureBox1.Height);
x2=rdX2.Next(0, pictureBox1.Width);
y2=rdY2.Next(0, pictureBox1.Height);
g.DrawLine(pen, x1, y1, x2, y2); //在内存位图上绘图
}
pictureBox1.Refresh(); //绘制完毕后更新一下
}
{
for (int i = 0; i < 100; i++)
{
x1=rdX1.Next(0, pictureBox1.Width);
y1=rdY1.Next(0, pictureBox1.Height);
x2=rdX2.Next(0, pictureBox1.Width);
y2=rdY2.Next(0, pictureBox1.Height);
g.DrawLine(pen, x1, y1, x2, y2); //在内存位图上绘图
}
pictureBox1.Refresh(); //绘制完毕后更新一下
}
很简单的技巧,记一下防止忘了

完整工程代码下载(VS2010):
http://www.m5home.com/blog//uploadfiles/csharp_autoredraw_14613.rar
添加评论
GB2312 https://www.m5home.com/blog/trackback.php?id=116&encode=gb2312
UTF-8 https://www.m5home.com/blog/trackback.php?id=116&encode=utf-8