关于控件Paint时的一些体会

     最近在把以前的一个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值