GDI+编程经验:滚动条、缩放、绘制闪烁
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了GDI+编程经验:滚动条、缩放、绘制闪烁,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2113字,纯文字阅读大概需要4分钟。
内容图文
原文链接:http://www.cnblogs.com/t00pcn/archive/2010/03/26/1697067.html 我们在使用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(......);
转载于:https://www.cnblogs.com/T00PCN/archive/2010/03/26/1697067.html
内容总结
以上是互联网集市为您收集整理的GDI+编程经验:滚动条、缩放、绘制闪烁全部内容,希望文章能够帮你解决GDI+编程经验:滚动条、缩放、绘制闪烁所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。