zoukankan      html  css  js  c++  java
  • 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(......);
  • 相关阅读:
    strlen和sizeof的区别
    gdb调试多进程和多线程命令
    (转)Mybatis insert后返回主键给实体对象(Mysql数据库)
    mybatis中使用where in查询时的注意事项
    MySQL IFNULL()函数用法MySQL
    (转)Mysql 多表查询详解
    HTTP的请求方法OPTIONS
    (转)跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享
    (转)HTML5开发中Access-Control-Allow-Origin跨域问题
    java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1697024.html
Copyright © 2011-2022 走看看