qq桌球瞄准器:开发QQ桌球瞄准器(3):绘制瞄准线及母球

 
本节我们介绍如何绘制瞄准线和母球
 
绘制瞄准线
瞄准线的绘制类似于画图程序(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  作者:邢泉  

    相关推荐

    相关文章