GDI+编程经验:滚动条、缩放、绘制闪烁

我们在使用GDI+实现类似画图板这样的系统时,经常需要支持平移、滚动条、缩放等功能、解决绘制时的闪烁,对于缺乏GDI+开发经验的朋友,经常 会在这些问题上纠缠一段或长或短的时间。在这里,我将自己的经验小结一下,给后来的朋友作个参考。

1.如何解决绘制闪烁?

(1)所有的绘制动作都应该Paint事件中完成。

  比如,即使我们要拖动一个View object,通常在MouseMove事件中处理拖动行为,但是不要在MouseMove事件中调用Graphics.Draw方法,而是应该采用 Command模式,将要绘制的动作封装为一个对象,传递到下一次的Paint事件中再绘制。

(2)设置双缓冲。

  通常我们会选择在某个控件的表面进行绘制,那么在初始化时,可以通过执行下面的代码来启用双缓冲:

this .SetStyle( ControlStyles .OptimizedDoubleBuffer  |   ControlStyles .AllPaintingInWmPaint  |   ControlStyles .UserPaint,  true );

  注意,SetStyle是一个Control基类的一个Protected方法,也就是说,只能在其派生类中才能调用该方法。

  通常,我是定义一个从Control继承的自定义控件,然后在构造方法中进行双缓冲设置,如:

    public   partial   class   ViewPanel  :  UserControl
    {
        
public  ViewPanel()
        {
            InitializeComponent();
            
this .SetStyle( ControlStyles .OptimizedDoubleBuffer  |   ControlStyles .AllPaintingInWmPaint  |   ControlStyles .UserPaint,  true );
        }
    }

(3)重新绘制发生变化的区域,而不是整个区域全部重绘。

  Control的Invalidate方法有一个重载接收Region 类 型的参数,表示下次paint时要重绘的区域。比如,当我们拖动一个对象时,只需要重绘比这个对象的Bounds大一点的区域即可。

2.滚动条与缩放

  当需要支持滚动条和缩放时,就需要采用一系列的坐标变换来正确的记录坐标和绘制图像,这些过程是比较繁琐的。幸运的是,GDI+能为我们减轻一 部分这方面的负担。当绘制view object时,只要我们指定Graphics对象的几个参数,Graphics对象就会自动采用正确的比例和偏移来绘制所有的view object了。比如:

        //Graphics g ;

        g.PageUnit  =   GraphicsUnit .Pixel;  // GraphicsUnit.Pixel才支持缩放与偏移绘制。
            g.TranslateTransform( this .hScrollValue,  this .vScrollValue); //设置滚动条的当前位置
            g.PageScale 
=   this .Scale; // 设置缩放比例
                    
             g.Draw(......);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值