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