关于控件Paint时的一些体会

原创 2006年06月18日 00:46:00

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

自定义View时,用到Paint Canvas的一些温故,自定义Loading控件(动画五,“六边形”的旋转跳跃)

转载请注明出处:王亟亟的大牛之路最近的一系列文章都是些的自定义控件的绘制,动画等效果,这一片就直接做一个自定义view,上一篇的地址:http://blog.csdn.net/ddwhan0123/a...

自定义控件三部曲之绘图篇(七)——Paint之函数大汇总

前言:厚积方能薄发经过前几篇,我们基本把paint和canvas的基本用法就看完了,今天我们来个大汇总,列举一个paint的所有函数,然后一个一个的过。经过这几篇,你将能学会paint中所有处理函数的...

Android 自定义控件-Canvas和Paint绘图详解-手把手带你绘制一个时钟.

1,Android - Paint基础在自定义控件时,经常需要使用canvas、paint等,在canvas类中,绘画基本都是靠drawXXX()方法来完成的,在这些方法中,很多时候都需要用到pain...

自定义控件二: Paint Canvar 画几何图形

最近在研究自定义控件,遇到了几何图形的绘制,这里就贴出来常见的例子: 首先在主Activity中代码: package com.example.mycustomwidget; import and...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于控件Paint时的一些体会
举报原因:
原因补充:

(最多只允许输入30个字)