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

  1. 添加成员变量到Form1类

public partial class Form1 : Form
          {
               private Graphics g;
               private Point startPoint;           //线条开始坐标
               private Point endPoint;             //线条结束坐标
               private float penWidth = 1;         //线条宽度
               private Color penColor = Color.Red; //绘图颜色
                  …...
           }

  1. 获取Graphics对象的引用

public Form1()
        {
                 InitializeComponent();
                 //获取Graphics对象的引用
                 g = this.CreateGraphics();
         }

  1. 为Form1窗体添加MouseClick事件

private void Form1_MouseClick(object sender, MouseEventArgs e)
       {
           //记住线条起点
           startPoint = new Point(e.X, e.Y);
       }

  1. 为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); //绘制线条
     }

  1. 运行程序,如下图所示


 
绘制线条的功能已经实现,但是原来绘制的线条并没有擦出,所以出现这种现象。继续修改程序。
 
擦除线条
先擦除之前的线条在画新的线条。修改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方法绘制圆形,同样的解决方法也是先擦除在绘制。

  1. 为Form1类添加成员变量
  2. private float radius = 10f;
  3. 修改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; //线条结束点是鼠标当前位置

  1. 运行程序,如下图所示:


 
本节内容至此,我们已经完成了桌球瞄准器程序的基本功能,正如你看到的基本功能很容易理解。现在你已经可以试着使用一下我们已经完成的功能了,只是在灵活性上有待改善。这将在后续的步骤中介绍。

代码下载
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  作者:邢泉

开发QQ桌球瞄准器(3):绘制瞄准线及母球相关推荐

  1. tt桌球瞄准器手机版_新年换台新手机!各价位段哪些机型值得入手?

    新机=新机遇.新机会,2021年请对我好一点,不如就从换个手机开始? 我们为大家吐血盘点了截止发稿各价位段上最推荐入手的机型,颗粒度500元一档,不止考虑性价比,还会参考真实用户体验.这一年群机荟萃. ...

  2. tt桌球瞄准器手机版_法国或将禁止不可拆卸手机,想当年手机后盖随便拆开玩儿...

    近日,法国通过了一项<维修权>相关法案,针对手机.电脑等电子消费品,规定禁止不可拆卸.维修.替换零件的一体机上市.并且,将对电子产品的易维修性进行1-10的打分,来向消费者提示设备的拆卸和 ...

  3. python如何自制音乐软件_Python开发制作酷狗和QQ音乐下载器

    开发工具 **Python版本:**3.6.4 相关模块: requests模块 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 相关文件 ...

  4. 从零玩转jQuery之项目开发(QQ音乐播放器)

    QQ音乐播放器项目 大体效果如下: HTML结构分析: 一.页面布局 1.首先来看下HTML大体结构: <div class="header"></div> ...

  5. java开发台球的图片_Java模拟桌球打击处理及绘制

    Java模拟桌球打击处理及绘制 由于Java可以很轻易的完成比较复杂的数学运算,所以我们经常能看到物理领域的问题借助Java实现效果演示,下面我给出一个桌球碰撞的处理及绘制实例. package or ...

  6. iOS开发 QQ粘性动画效果

    QQ(iOS)客户端的粘性动画效果 时间 2016-02-17 16:50:00  博客园精华区 原文  http://www.cnblogs.com/ziyi--caolu/p/5195615.ht ...

  7. .net vue漂亮登录界面_基于 electron-vue 开发的音乐播放器「实践」

    作者:XiaoTuGou 转发链接:https://github.com/SmallRuralDog 前言 基于 electron-vue 开发的音乐播放器,界面模仿QQ音乐. 技术栈electron ...

  8. 截获网易云、酷狗、QQ音乐播放器桌面歌词画面心德

    在直播项目中 需要捕获某个窗口的画面并共享 总结了如下几种场景中窗口的捕获方法 1.dc拷贝(BitBlt.PrintWindow) 这是最基本的方法 直接拿到窗口dc 然后从dc中拷贝窗口画面 可优 ...

  9. 微信PHP开发《音乐播放器》

    文章目录 前言 一.简介 二.引入Vant框架 1.引入库 2.需要用到的知识 三.页面编写,以及js的实现 1.首页 2.搜索页 3.获取搜索歌曲 4.播放页 5.榜单列表页 6.对应页面的json ...

  10. Qt 仿QQ图片查看器

    最近项目中,由于需要查看图片.看了网上写的各种图片查看器.感觉都没有QQ图片查看器那种界面好看一点.并且放大了可以移动图片.为此,想着仿QQ图片查看器自己写了一个,如图: 主要实现的功能有: 鼠标滚轮 ...

最新文章

  1. 去掉[]中的英文(正则表达式)C#
  2. 【NLP实战系列】Tensorflow命名实体识别实战
  3. cat命令分析_学习记录
  4. Linux命令:MySQL系列之十一--MySQL日志管理
  5. 别问我跨域了,我想吐
  6. 从生物神经网络到人工神经网络
  7. global.min.css,css3-媒体查询样式不覆盖原始样式
  8. 怎么利用linux来操作手机,Linux_在Linux操作系统下操作蓝牙手机的方法,所谓操作,到现在只是通过蓝 - phpStudy...
  9. Dubbo学习笔记(一)
  10. 简述linux内核中,Linux内核中的文件描述符(一)——基础知识简介
  11. 苹果的困境源于优质移动应用的垮台吗?
  12. javascript基础案例解析
  13. magisk核心功能模式是什么_科技板块——深入解析MM管理器
  14. JAVA数据结构和算法系列视频教程 20课
  15. photoshop2019及其破解器
  16. [LintCode]144. 交错正负数(献给卡在65%的你)
  17. java调用快捷支付接口_Android客户端集成支付宝快捷支付
  18. 牛顿冷却定律,衰减因子alpha
  19. STI、LOD与WPE概念:STI效应对SPICE Model的影响
  20. PHP之两个日期之间相差天数

热门文章

  1. 农历 阴历 转换阳历算法
  2. netware php_服务器_如何在 Netware 服务器中安装多块网卡,如果网络在扩大时服务器只装 - phpStudy...
  3. 基于搜狗新闻语料库的词向量模型训练(Windows下)
  4. 投资理财之基金二:购买基金的渠道
  5. 获取select选中的值php,js如何获取select标签选中的值
  6. 档案管理学川大972 | 档案信息资源开发与利用
  7. 【物联网开发基础】plc简介
  8. 怎样找到win7系统默认的微信缓存文件夹路径
  9. java山海经之轩辕_山海经之情剑轩辕 炼化任务详细攻略
  10. 交换机下接路由器lan还是wan_小白请教,自家网络搭建中,光猫、交换机、无线路由器、NAS布线问题...