欢迎来到老马的领地~ 这是“压风式散热底座”发明者的个人网站:) 本人QQ:80524554,用户群1:562279766
在C#里用图片框绘图想要持久化,不像VB6里那么方便,因为没有提供AutoRedraw了。

常规办法绘好后,一遮挡就成这样了:

http://www.m5home.com/blog//uploadfiles/edd21d12qwedy54_87865.jpg


那要么就自动管理重绘,这是最好的性能方案,但代码很多。

另一种办法是利用C#里图片框加载图片时会自动重绘的特点来投鸡。。。lol.gif

简单来说,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;                                //图片框图片来源设置为内存位图
        }


然后绘图都在这个位图对象上绘,绘完后通知图片框更新一下就行了:

        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();                                  //绘制完毕后更新一下
        }


很简单的技巧,记一下防止忘了shocked.gif

完整工程代码下载(VS2010):

http://www.m5home.com/blog//uploadfiles/csharp_autoredraw_14613.rar
添加评论

昵称 *

E-mail