由于刚学习c#,窗口全屏的时候,控件自适应移动位置,在移动的时候出现严重闪烁,自己查了一下,用双缓冲效果不大,所以用重绘,但是代码完全看不懂。。。求解答,doc.drawobjectlist是从哪里获取的?
Rectangle rect = e.ClipRectangle;
Bitmap bufferimage = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bufferimage);
g.Clear(this.BackColor);
g.SmoothingMode = SmoothingMode.HighQuality; //高质量
g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量
foreach (IShape drawobject in doc.drawObjectList)
{
if (rect.IntersectsWith(drawobject.Rect))
{
drawobject.Draw(g);
if (drawobject.TrackerState == config.Module.Core.TrackerState.Selected
&& this.CurrentOperator == Enum.Operator.Transfrom)//仅当编辑节点操作时显示图元热点
{
drawobject.DrawTracker(g);
}
}
}
using (Graphics tg = e.Graphics)
{
tg.DrawImage(bufferimage, 0, 0); //把画布贴到画面上
}
drawobjectlist是示例代码中文档中画布上的图形对象,doc和drawObjectList都是为了演示而写的。
在一个真实的程序中,我们往往使用MVC设计模式,将文档(描述数据)和视图(将数据呈现出来)分开。而不是将绘图的代码写死。
这样你的程序可以方便地修改文档结构,并且通知程序刷新。
foreach (IShape drawobject in doc.drawObjectList)
这是遍历文档中所有的图元(或者说抽象的形状,IShape)
rect.IntersectsWith(drawobject.Rect)
这里是做一个判断,只绘制可见区域内的,以便提高性能