從一個畫圖程式談起---基礎,GDI+(1)

來源:互聯網
上載者:User

這是一個很小的.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作為獎勵   老鳥就別來搶了 

 

 



原始碼下載 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.