你问我为什么要写它? 呵呵,新手可以学习啊,也算为新手区添砖加瓦。 不过这不是我写它的主要原因。这是一个比较,我将拿它和使用模式后的方法进行比较,从而让你体会到模式的小威力。新手也不妨将两种实现比较一下,最起码你能学到怎么画线,另外还能看到模式是个好东西。
 不过这不是我写它的主要原因。这是一个比较,我将拿它和使用模式后的方法进行比较,从而让你体会到模式的小威力。新手也不妨将两种实现比较一下,最起码你能学到怎么画线,另外还能看到模式是个好东西。
由于这个程序过于简单,我在此只简单介绍下主要的函数。
下面是画线的程序,主要问题在于你脱拽的时候要把原来的线擦掉。在GDI+中并没有提供XOR的橡皮线画法,所以变通一下,自己擦 。
这个地方有点问题:为什么GDI+不提供XOR的功能?而且我查看MSDN,橡皮线可以通过DLLimport来实现,但是GDI docotor却推荐用下面的方法。 
不知道效率上会有什么区别,区别大吗? 
还有就是用这种方法会把经过的其他线也擦掉一些,不知道用XOR方法会不会也这样。 
所以放在首页,哪位GDI高手指教一下。搞定就放到新手区。 
     
   
 public void DrawLine(Point start, Point end)
public void DrawLine(Point start, Point end)  
 {
{  
 drawingGraphics.DrawLine(erasePen, start, previousPoint);
              drawingGraphics.DrawLine(erasePen, start, previousPoint);   
 drawingGraphics.DrawLine(drawPen, start, end);
              drawingGraphics.DrawLine(drawPen, start, end);  
 previousPoint = end;
              previousPoint = end;  
 }
}  
 
 
       
下面这段就长了,主要是鼠标点击下去所要干的事,要分情况讨论,出现了该死的if else,(模式就是要消除这种条件判断)。相信大家应该能看懂吧
 private void Form1_MouseDown(object sender, MouseEventArgs e)
private void Form1_MouseDown(object sender, MouseEventArgs e)   
 {
         {  
 
  
 if (bDrawLine && bFirstDown)
              if (bDrawLine && bFirstDown)  
 {
               {   
 this.Cursor = Cursors.Cross;
                   this.Cursor = Cursors.Cross;  
 Line newLine = new Line();
                   Line newLine = new Line();  
 newLine.StartPoint = new Point(e.X, e.Y);
                   newLine.StartPoint = new Point(e.X, e.Y);  
 drawingLine = newLine;
                   drawingLine = newLine;   
 bFirstDown = false;
                   bFirstDown = false;  
 }
              }  
 else if (bDrawLine == true && bFirstDown == false)
              else if (bDrawLine == true && bFirstDown == false)   
 {
              {  
 if (drawingLine != null)
                    if (drawingLine != null)   
 {
                   {   
 drawingLine.EndPoint = new Point(e.X, e.Y);
                       drawingLine.EndPoint = new Point(e.X, e.Y);  
 AddLine(drawingLine);
                       AddLine(drawingLine);  
 this.Cursor = Cursors.Arrow;
                       this.Cursor = Cursors.Arrow;   
 bFirstDown = true;
                       bFirstDown = true;   
 }
                   }  
 }
              }  
 }
}   
 
   
  
然后就是鼠标移动的效果了,其中用到了第一个介绍的函数。
 private void Form1_MouseMove(object sender, MouseEventArgs e)
private void Form1_MouseMove(object sender, MouseEventArgs e)  
 {
          {  
 if (bFirstDown == false&&bDrawLine == true)
              if (bFirstDown == false&&bDrawLine == true)  
 {
              {  
 if (drawingLine != null)
                   if (drawingLine != null) 
 {
                   {  
 Point mousePoint = new Point(e.X, e.Y);
                       Point mousePoint = new Point(e.X, e.Y);  
 DrawLine(drawingLine.StartPoint, mousePoint);
                       DrawLine(drawingLine.StartPoint, mousePoint);  
 }
                   }  
 }
              }  
 }
         }   
 
   
我也不打算详细介绍了,从这几个函数我们就可以看到,在Form1_MouseDown函数中干得事太多了,而且还有那些个条件判断。目前的功能这么简单,但是逻辑性已经如此不清楚了,如果我要实现抓取line的功能,那条件判断还得了?Form1_MouseDown也估计只有写得人自己能看懂了。这是我们就要发挥设计模式的威力了,请见下回分解。
你能想到用什么模式解决吗?作为新手,给你一个Wallop作为奖励  老鸟就别来抢了
  老鸟就别来抢了 
 
 
        

 
                
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号