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