最近在把以前的一个MFC控件转移到dotNet上。在写Paint事件时需要使用大量大幅的图片的合成、动态GIF、描边字,半透明阴影等。这是我第一次大量接触GDI+,感觉的确比传统GDI要强大好多。但毕竟是刚刚接触,在使用中也遇到了不少的麻烦。特此在这里慢慢总结一下,留个纪念,以便以后的的查阅。如有不对之处还望见谅并指出。
1、关于双缓冲
由于有大量的大幅图片的合成和艺术字体的绘制,如果直接在Paint里绘制按以前MFC的经验肯定要刷屏的。那么条件反射就是要用双缓冲。察看Framework的SDK,没有明确的提到。没办法,只好自己摸索。现在的我得到的办法是用。
建立全局变量 Dim bufBitmap as Bitmap Dim BufG as Graphics 用于双缓冲使用
在Form_Load时 建立等同于窗体或控件大小的Bitmap缓冲: eg: bufBitmap = new BitMap(me.width,me.heigh)
在Form_ReSize时 跟新bufBitmap的大小
eg: bufBitmap.dispose()
bufBitmap = Nothing
bufBitmap = new BitMap(me.width,me.heigh)
在Form_Paint时 根据bufBitmap 建立容器 BufG = Graphics.FromImage(imageFile)
接着在BufG上绘制所有的图形,最有 在窗口或空间自己的Graphics.DrawImage(bufBitmap,0,0)
2、关于即使使用双缓重也会发生刷屏的问题
原本以为使用了双缓冲就没有刷屏了,没想到在快速的更新控件时还是发生了刷屏的问题。
怎么回事? 啊!忘了。原来在MFC时,还要终止Form的背景擦除事件。可是一开始没在Form的事件
里找到这个事件。难道是微软忘了?不太可能。继续找........... 结果找到了。原来微软把背景擦除事件作为Overrides了。完整的SDK描述是
Protected Overridable Sub OnPaintBackground( _
ByVal pevent As PaintEventArgs _
)
现在只要实现该Overridable 不要在事件里填写任何代码,就屏蔽了背景擦除事件。对!就这么简单
还有,查找过程中我找到了一个超有用的事件
Protected Overridable Sub WndProc( _
ByRef m As Message _
)
可能直接从C#等语言开始写程序的人并不了解这个函数,但只要写过纯C或MFC Win32的人一定会对它很亲切的.
今天就写到这里,其他的一些想法,以后慢慢在补.欢迎大家一起讨论.
附: 一个练习GDI+的小程序.还没有完全完成.(春丽GiF动画会跟随鼠标,完全GDI+绘制所用界面)
下载: GDI+的小程序