享受代码,享受人生

SOA is an integration solution. SOA is message oriented first.
The Key character of SOA is loosely coupled. SOA is enriched
by creating composite apps.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

从一个画图程序谈起---基础,GDI+(1)

Posted on 2005-01-29 01:13  idior  阅读(5480)  评论(19编辑  收藏

这是一个很小的.Net下的一个画图的程序。说它能画图都过分,因为它只能画线段。

你问我为什么要写它? 呵呵,新手可以学习啊,也算为新手区添砖加瓦。 不过这不是我写它的主要原因。这是一个比较,我将拿它和使用模式后的方法进行比较,从而让你体会到模式的小威力。新手也不妨将两种实现比较一下,最起码你能学到怎么画线,另外还能看到模式是个好东西。

 

由于这个程序过于简单,我在此只简单介绍下主要的函数。

 

下面是画线的程序,主要问题在于你脱拽的时候要把原来的线擦掉。在GDI+中并没有提供XOR的橡皮线画法,所以变通一下,自己擦
这个地方有点问题:为什么GDI+不提供XOR的功能?而且我查看MSDN,橡皮线可以通过DLLimport来实现,但是GDI docotor却推荐用下面的方法。
不知道效率上会有什么区别,区别大吗?
还有就是用这种方法会把经过的其他线也擦掉一些,不知道用XOR方法会不会也这样。
所以放在首页,哪位GDI高手指教一下。搞定就放到新手区。

    

public void DrawLine(Point start, Point end) 

              drawingGraphics.DrawLine(erasePen, start, previousPoint);  
              drawingGraphics.DrawLine(drawPen, start, end); 
              previousPoint 
= end; 
}
 



下面这段就长了,主要是鼠标点击下去所要干的事,要分情况讨论,出现了该死的if else,(模式就是要消除这种条件判断)。相信大家应该能看懂吧


private void Form1_MouseDown(object sender, MouseEventArgs e)  
         

 
              
if (bDrawLine && bFirstDown) 
               
{  
                   
this.Cursor = Cursors.Cross; 
                   Line newLine 
= new Line(); 
                   newLine.StartPoint 
= new Point(e.X, e.Y); 
                   drawingLine 
= newLine;  
                   bFirstDown 
= false
              }
 
              
else if (bDrawLine == true && bFirstDown == false)  
              

                    
if (drawingLine != null)  
                   
{  
                       drawingLine.EndPoint 
= new Point(e.X, e.Y); 
                       AddLine(drawingLine); 
                       
this.Cursor = Cursors.Arrow;  
                       bFirstDown 
= true;  
                   }
 
              }
 
}
 


 

然后就是鼠标移动的效果了,其中用到了第一个介绍的函数。


private void Form1_MouseMove(object sender, MouseEventArgs e) 
          

              
if (bFirstDown == false&&bDrawLine == true
              

                   
if (drawingLine != null)
                   

                       Point mousePoint 
= new Point(e.X, e.Y); 
                       DrawLine(drawingLine.StartPoint, mousePoint); 
                   }
 
              }
 
         }
 

 

我也不打算详细介绍了,从这几个函数我们就可以看到,在Form1_MouseDown函数中干得事太多了,而且还有那些个条件判断。目前的功能这么简单,但是逻辑性已经如此不清楚了,如果我要实现抓取line的功能,那条件判断还得了?Form1_MouseDown也估计只有写得人自己能看懂了。这是我们就要发挥设计模式的威力了,请见下回分解

 

你能想到用什么模式解决吗?作为新手,给你一个Wallop作为奖励   老鸟就别来抢了   


源代码下载