windows Mobile 双缓冲绘图

来源:互联网 发布:日漫多的软件 编辑:程序博客网 时间:2024/06/04 23:54

public class formWithBackGround : System.Windows.Forms.Form

     {

        protected Bitmap backBuffer;

        public formWithBackGround()

        {

            backBuffer = new Bitmap(240, 268);

        }

        protected override void OnPaintBackground(PaintEventArgs e)

        {

            if (backBuffer != null)

            {

                using (Graphics gxBuffer = Graphics.FromImage(backBuffer))

                {

                    gxBuffer.Clear(Color.Black);


                    using (Image backGroundImage = new Bitmap(System.Reflection.Assembly.GetExecutingAssembly()

                        .GetManifestResourceStream("CRM.bj.bmp")))

                    {

                        gxBuffer.DrawImage(backGroundImage, 0, 0);

                    }

                }

                e.Graphics.DrawImage(backBuffer, 0, 0);

            }

            else

            {

                e.Graphics.Clear(this.BackColor);

            }

        }

    }


代码很简单,思路也很简单:

    1、在内存中创建与画布一致的缓冲区

2、在缓冲区画图    3、将缓冲区位图拷贝到当前画布上    4、释放内存缓冲区

 

using起到了自动释放资源的作用,具体参见前面C# using的用法。

开始用双缓冲没达到效果,还是闪烁,在MSDN查看form的方法发现OnPaintBackground,顾名思义,为绘制背景的函数。开始是重载的OnPaint函数,在重载OnPaintBackground如下之后闪烁问题解决:

 

        protected override void OnPaintBackground(PaintEventArgs e)

{
    //do nothing
}
因为仅仅重绘了背景,所以干脆不重载OnPaint函数了,只重载OnPaintBackground。
总结如下:
    1、控件重绘一般分为几部分:画背景,画内容(item项,图标项),画文字等。首先弄清楚,控件绘制到底有哪些函数,这个可以查MSDN,查看所有的OnPaint OnDraw方法。
    2、分析自己到底需要重写哪些部分,重写相应函数。如果需要重写包括OnPaint的全部函数:
//下面为伪代码,没有查具体函数名
override OnPaintbackground
override OnDrawItem
override OnDrawText
override OnPaint 
{
    OnPaintbackground();
    OnDrawItem();
    OnDrawText();

}