我们在使用GDI+实现类似画图板这样的系统时,经常需要支持平移、滚动条、缩放等功能、解决绘制时的闪烁,对于缺乏GDI+开发经验的朋友,经常会在这些问题上纠缠一段或长或短的时间。在这里,我将自己的经验小结一下,给后来的朋友作个参考。
1.如何解决绘制闪烁?
(1)所有的绘制动作都应该Paint事件中完成。
比如,即使我们要拖动一个View object,通常在MouseMove事件中处理拖动行为,但是不要在MouseMove事件中调用Graphics.Draw方法,而是应该采用Command模式,将要绘制的动作封装为一个对象,传递到下一次的Paint事件中再绘制。
(2)设置双缓冲。
通常我们会选择在某个控件的表面进行绘制,那么在初始化时,可以通过执行下面的代码来启用双缓冲:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->this.SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint,true);
注意,SetStyle是一个Control基类的一个Protected方法,也就是说,只能在其派生类中才能调用该方法。
通常,我是定义一个从Control继承的自定义控件,然后在构造方法中进行双缓冲设置,如:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> publicpartialclassViewPanel:UserControl
{
publicViewPanel()
{
InitializeComponent();
this.SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint,true);
}
}
(3)重新绘制发生变化的区域,而不是整个区域全部重绘。
Control的Invalidate方法有一个重载接收Region类型的参数,表示下次paint时要重绘的区域。比如,当我们拖动一个对象时,只需要重绘比这个对象的Bounds大一点的区域即可。
2.滚动条与缩放
当需要支持滚动条和缩放时,就需要采用一系列的坐标变换来正确的记录坐标和绘制图像,这些过程是比较繁琐的。幸运的是,GDI+能为我们减轻一部分这方面的负担。当绘制view object时,只要我们指定Graphics对象的几个参数,Graphics对象就会自动采用正确的比例和偏移来绘制所有的view object了。比如:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> //Graphics g ;
g.PageUnit=GraphicsUnit.Pixel;//GraphicsUnit.Pixel才支持缩放与偏移绘制。
g.TranslateTransform(this.hScrollValue,this.vScrollValue);//设置滚动条的当前位置
g.PageScale=this.Scale;//设置缩放比例
g.Draw(......);
分享到:
相关推荐
GDI+编程
GDI+ 编程 GDI+ 编程 GDI+ 编程 GDI+ 编程
GDI+鼠标绘制常规图形平衡缩放DEMO,使用C#语言,附有全部源码。可以进行点、线、多边形、圆、椭圆、弧线还有文本等等的绘制,以及撤销、刷新、删除等功能,是个比较好的示例。
精通GDI+编程 目录: 第一章 Visual C++.NET简介 第二章 GDI+编程基础 第三章 画笔和画刷 第四章 文本和字体 第五章 路径和区域 第六章 在GDI+中使用变换 第七章 GDI+的色彩变换 第八章 图像的基本处理 第九章 调整...
GDI+ 编程顶级示例(附 源码) GDI+编程能力提高
用Visual C++.NET进行GDI+编程 Visual C++.NET GDI+编程基础 VC++ GDI+编程的字体和文本绘制 基于VC.NET的GDI+图像处理
精通GDI+编程 精通GDI+编程 精通GDI+编程精通GDI+编程
精通GDI+编程 本书详细介绍了GDI+的所有技术细节和操作技巧,并配之以详尽的程序源代码,使读者更快,更好的掌握GDI+编程。
了解 GDI+ 学习和熟悉GDI+常用的数据结构和类 探讨 GDI+ 中的对象:Pen、Brush 和 Color 通过 GDI+ 绘制线条、形状和文本 使用 GDI+ 显示图像
精通GDI+编程和源代码,含有精通GDI+编程.PDF文档和随书源代码
GDI+编程基础(一)GDI+ Vs GDI.doc