qq桌球瞄准器:开发QQ桌球瞄准器(3):绘制瞄准线及母球 2024-04-30 11:41:25 0 0 本节我们介绍如何绘制瞄准线和母球 绘制瞄准线 瞄准线的绘制类似于画图程序(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); 或者这样写 // 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); DrawLine方法是绘制一条连接由坐标对指定的两个点的线条。 绘制椭圆 // 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); DrawEllipse方法是绘制一个由边框(该边框由一对坐标、高度和宽度指定)定义的椭圆。当矩形的高度和宽度一致的时候正好是个圆。 关于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 相关章节 http://dev.mjxy.cn/a-Tutorial-5-QQ-Snooker-sight.aspx 步骤1:桌球瞄准器介绍与使用方法 步骤2:创建项目添加主窗体 步骤3:绘制瞄准线及母球 步骤4:透明度、颜色、线宽与母球大小 步骤5:使用注册表保存配置 步骤6:更精确瞄准目标球的绘制 步骤7:帮助与软件注册的简单方法 转载请注明: 敏捷学院-技术资源库原文链接: http://dev.mjxy.cn/a-Step-3-Draw-the-line-of-sight-and-the-cue-ball.aspx 转载请注明: 敏捷学院-技术资源库 http://mjxy.cn 作者:邢泉 收藏(0)