关闭

关于控件Paint时的一些体会

1039人阅读 评论(0) 收藏 举报

     最近在把以前的一个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+的小程序

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20570次
    • 积分:306
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论