一个GIS系统最重要的功能是绘制图形和关联属性,这里研究二维点线面的绘制过程:
对于一个绘图系统设计,图形的绘制涉及两个重要的方面。
- 1.一个是绘制或者重新绘制,重绘过程出现在下面情况:
a 界面初始化的时候(全部刷新)
b 窗体大小变化的时候(全部刷新)
c 编辑图形的过程中,增加、删除、修改(移动图形和移动节点)。这里需要思考是整个画布刷新还是局部刷新。如果画布没有发生变化就应该保持画布上已有的东西,通过缓存图片的方式,局部刷新变化的(新绘制、修改)的部分。否则会出现整个画布闪烁现象。
所谓局部刷新就是只对变化的部分刷新。这里的一种解决方法是,获取缓存图片受影响范围,在此范围重新绘制图形。
方法一:dc.DrawImage(m_staticImage, r, r, GraphicsUnit.Pixel);
方法二:
1 int x = Math.Min((int)m_start_x,(int)e.X); 2 int y = Math.Min((int)m_start_y,(int)e.Y); 3 int w = Math.Abs((int)(e.X-m_start_x)); 4 int h = Math.Abs((int)(e.Y-m_start_y)); 5 6 Rectangle clip_rect = new Rectangle(x-6,y-6,w+12,h+12); 7 8 switch(m_draw_mode) 9 {10 11 case DrawingMode.Line:12 {13 14 Invalidate(clip_rect);15 Update();16 graph.DrawLine(pen,(int)m_start_x,17 (int)m_start_y,18 (int)e.X,19 (int)e.Y);20 }21 break;22 23 case DrawingMode.Rectangle:24 { 25 Invalidate(clip_rect);26 Update(); 27 graph.DrawRectangle(pen,x,y,w,h); 28 }29 break;30 31 case DrawingMode.Polygon:32 {33 34 35 if(m_current_polygon.Count>1)36 { 37 Invalidate(clip_rect);38 Update();39 m_current_polygon[m_current_polygon.Count-1] = new PointF(e.X,e.Y);40 41 Point[] points = new Point[m_current_polygon.Count];42 for(int i=0; i
这里可以展示一下ArcGIS中的图片,左图为移动,右图为编辑节点。可以看出蓝色部分为缓存的图片,右图更加明显,由蓝色部分移动到下方后又往回移动,下方的为缓存图片的显示。同样,移动画笔,放大,缩小都是采用缓存图片来绘制,提升用户体验的效果。
d 选中图形后。(局部刷新)
e 画布移动的过程中。(整体刷新,最好能够界面保持技术,局部刷新)
- 2.另一个是编辑,编辑过程涉及大量的鼠标事件、键盘事件MouseDown、MouseMove、MouseUp
MouseDown | MouseMove | MouseUp | DoubleClick | |
点 | 绘制点。完成单点绘制 | |||
线 | 绘制点 n=1 n>1 | 局部刷新,绘制新增的线段 | 完成绘制 | |
面 | 绘点 n=1绘点 n=2绘线 n>2绘制面 | 局部刷新 | 完成绘制 | |
矩形 | 绘制点 n=1 | 局部刷新 绘制矩形 | 绘制矩形 | |
圆弧 | n=1 n=2 n=3 完成绘制 | |||
圆 | 中点-半径 n=1 n=2 完成绘制 三点 n=1 n=2 n=3完成绘制 | 局部刷新 | ||
移动画布 绘制中移动 移动图形 |