本节我们介绍如何绘制瞄准线和母球
绘制瞄准线
瞄准线的绘制类似于画图程序(windows 的mspaint.exe)的画线功能。当第一次单击鼠标左键的时候定义绘制线段的起点,然后移动鼠标的同时线条会跟随鼠标的移动而增加或减少长度。再次单击鼠标左键完成线条的绘制。与mspaint.exe不同的是,我们绘制线条时不需要按住左键不放。
用 GDI+ 绘制线条和形状
继续下面的内容你需要了解一些GDI+绘图的基本知识。GDI+ 使您可以创建图形、绘制文本以及将图形图像作为对象操作。GDI+ 旨在提供较好的性能并且易于使用。可以使用 GDI+ 在 Windows 窗体和控件上呈现图形图像。
用 GDI+ 绘制线条和形状需要先创建 Graphics 对象,然后才可以使用 GDI+ 绘制线条和形状、呈现文本或显示与操作图像。创建Graphics对象的方法有几种方法,我们使用 CreateGraphics 方法来获取对 Graphics 对象的引用。例如,在窗体上绘制一条红色的直线,起点是(10,10)终点是(100,100):
绘制线条
或者这样写Graphics g = this.CreateGraphics();
g.DrawLine(Pens.Red, 10, 10, 100, 100);
DrawLine方法是绘制一条连接由坐标对指定的两个点的线条。// Create pen.
Pen blackPen = new Pen(Color.Red, 3);
// Create points that define line.
Point point1 = new Point(10, 10);
Point point2 = new Point(100, 100);
// Draw line to screen.
g.Graphics.DrawLine(blackPen, point1, point2);
绘制椭圆
DrawEllipse方法是绘制一个由边框(该边框由一对坐标、高度和宽度指定)定义的椭圆。当矩形的高度和宽度一致的时候正好是个圆。// Create pen.
Pen blackPen = new Pen(Color.Black, 3);
// Create rectangle for ellipse.
Rectangle rect = new Rectangle(0, 0, 200, 100);
// Draw ellipse to screen.
e.Graphics.DrawEllipse(blackPen, rect);
关于GDI+的更多知识请参考:GDI+图像介绍 http://dev.mjxy.cn/a-GDIplus-Graphics-Introduction.aspx
绘制瞄准线
绘制线条
- 添加成员变量到Form1类
public partial class Form1 : Form
{
private Graphics g;
private Point startPoint; //线条开始坐标
private Point endPoint; //线条结束坐标
private float penWidth = 1; //线条宽度
private Color penColor = Color.Red; //绘图颜色
…...
}
- 获取Graphics对象的引用
public Form1()
{
InitializeComponent();
//获取Graphics对象的引用
g = this.CreateGraphics();
}
- 为Form1窗体添加MouseClick事件
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
//记住线条起点
startPoint = new Point(e.X, e.Y);
}
- 为Form1窗体添加MouseMove事件
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Point cur_pos = new Point(e.X, e.Y); //鼠标当前位置
endPoint = cur_pos; //线条结束点是鼠标当前位置
Pen pen = new Pen(penColor, penWidth); //创建画笔
g.DrawLine(pen, startPoint, endPoint); //绘制线条
}
- 运行程序,如下图所示

绘制线条的功能已经实现,但是原来绘制的线条并没有擦出,所以出现这种现象。继续修改程序。
擦除线条
先擦除之前的线条在画新的线条。修改MouseMove事件中的代码如下:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Point cur_pos = new Point(e.X, e.Y); //鼠标当前位置
Pen pen;
if (startPoint != endPoint) //擦除:绘制和背景色一样的线条
{
pen = new Pen(this.BackColor, penWidth); //使用背景色创建画笔
g.DrawLine(pen, startPoint, endPoint); //绘制线条
}
//绘制线条
pen = new Pen(penColor, penWidth);
g.DrawLine(pen, startPoint, cur_pos);
endPoint = cur_pos; //线条结束点是鼠标当前位置
}
程序运行如下图所示:

上图运行的结果正是我们想要的效果。
绘制圆形母球
使用Graphics类的DrawEllipse方法绘制圆形,同样的解决方法也是先擦除在绘制。
- 为Form1类添加成员变量
- private float radius = 10f;
- 修改Form1_MouseMove事件代码
Point cur_pos = new Point(e.X, e.Y); //鼠标当前位置
Pen pen;
if (startPoint != endPoint) //擦除:绘制和背景色一样的线条
{
pen = new Pen(this.BackColor, penWidth); //使用背景色创建画笔
g.DrawLine(pen, startPoint, endPoint); //绘制线条
//绘制母球
g.DrawEllipse(new Pen(this.BackColor, penWidth), endPoint.X - radius, endPoint.Y - radius, radius * 2, radius * 2);
}
//绘制线条
pen = new Pen(penColor, penWidth);
g.DrawLine(pen, startPoint, cur_pos);
//绘制母球
g.DrawEllipse(pen, e.X - radius, e.Y - radius, radius * 2, radius * 2);
endPoint = cur_pos; //线条结束点是鼠标当前位置
- 运行程序,如下图所示:
本节内容至此,我们已经完成了桌球瞄准器程序的基本功能,正如你看到的基本功能很容易理解。现在你已经可以试着使用一下我们已经完成的功能了,只是在灵活性上有待改善。这将在后续的步骤中介绍。
代码下载
taiqiu_step3.zip
参考资料
http://dev.mjxy.cn/a-GDIplus-Graphics-Introduction.aspx
http://msdn.microsoft.com/zh-cn/library/system.drawing.graphics(en-us).aspx
http://msdn.microsoft.com/zh-cn/library/system.drawing.pen(en-us).aspx
http://msdn.microsoft.com/zh-cn/library/system.drawing.graphics.drawline(VS.80).aspx
http://msdn.microsoft.com/zh-cn/library/system.drawing.graphics.drawellipse(VS.80).aspx
步骤2:创建项目添加主窗体
步骤3:绘制瞄准线及母球
步骤4:透明度、颜色、线宽与母球大小
步骤5:使用注册表保存配置
步骤6:更精确瞄准目标球的绘制
步骤7:帮助与软件注册的简单方法
转载请注明: 敏捷学院-技术资源库 http://mjxy.cn 作者:邢泉