开发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
步骤2:创建项目添加主窗体
步骤3:绘制瞄准线及母球
步骤4:透明度、颜色、线宽与母球大小
步骤5:使用注册表保存配置
步骤6:更精确瞄准目标球的绘制
步骤7:帮助与软件注册的简单方法
转载请注明: 敏捷学院-技术资源库 http://mjxy.cn 作者:邢泉
开发QQ桌球瞄准器(3):绘制瞄准线及母球相关推荐
- tt桌球瞄准器手机版_新年换台新手机!各价位段哪些机型值得入手?
新机=新机遇.新机会,2021年请对我好一点,不如就从换个手机开始? 我们为大家吐血盘点了截止发稿各价位段上最推荐入手的机型,颗粒度500元一档,不止考虑性价比,还会参考真实用户体验.这一年群机荟萃. ...
- tt桌球瞄准器手机版_法国或将禁止不可拆卸手机,想当年手机后盖随便拆开玩儿...
近日,法国通过了一项<维修权>相关法案,针对手机.电脑等电子消费品,规定禁止不可拆卸.维修.替换零件的一体机上市.并且,将对电子产品的易维修性进行1-10的打分,来向消费者提示设备的拆卸和 ...
- python如何自制音乐软件_Python开发制作酷狗和QQ音乐下载器
开发工具 **Python版本:**3.6.4 相关模块: requests模块 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 相关文件 ...
- 从零玩转jQuery之项目开发(QQ音乐播放器)
QQ音乐播放器项目 大体效果如下: HTML结构分析: 一.页面布局 1.首先来看下HTML大体结构: <div class="header"></div> ...
- java开发台球的图片_Java模拟桌球打击处理及绘制
Java模拟桌球打击处理及绘制 由于Java可以很轻易的完成比较复杂的数学运算,所以我们经常能看到物理领域的问题借助Java实现效果演示,下面我给出一个桌球碰撞的处理及绘制实例. package or ...
- iOS开发 QQ粘性动画效果
QQ(iOS)客户端的粘性动画效果 时间 2016-02-17 16:50:00 博客园精华区 原文 http://www.cnblogs.com/ziyi--caolu/p/5195615.ht ...
- .net vue漂亮登录界面_基于 electron-vue 开发的音乐播放器「实践」
作者:XiaoTuGou 转发链接:https://github.com/SmallRuralDog 前言 基于 electron-vue 开发的音乐播放器,界面模仿QQ音乐. 技术栈electron ...
- 截获网易云、酷狗、QQ音乐播放器桌面歌词画面心德
在直播项目中 需要捕获某个窗口的画面并共享 总结了如下几种场景中窗口的捕获方法 1.dc拷贝(BitBlt.PrintWindow) 这是最基本的方法 直接拿到窗口dc 然后从dc中拷贝窗口画面 可优 ...
- 微信PHP开发《音乐播放器》
文章目录 前言 一.简介 二.引入Vant框架 1.引入库 2.需要用到的知识 三.页面编写,以及js的实现 1.首页 2.搜索页 3.获取搜索歌曲 4.播放页 5.榜单列表页 6.对应页面的json ...
- Qt 仿QQ图片查看器
最近项目中,由于需要查看图片.看了网上写的各种图片查看器.感觉都没有QQ图片查看器那种界面好看一点.并且放大了可以移动图片.为此,想着仿QQ图片查看器自己写了一个,如图: 主要实现的功能有: 鼠标滚轮 ...
最新文章
- 去掉[]中的英文(正则表达式)C#
- 【NLP实战系列】Tensorflow命名实体识别实战
- cat命令分析_学习记录
- Linux命令:MySQL系列之十一--MySQL日志管理
- 别问我跨域了,我想吐
- 从生物神经网络到人工神经网络
- global.min.css,css3-媒体查询样式不覆盖原始样式
- 怎么利用linux来操作手机,Linux_在Linux操作系统下操作蓝牙手机的方法,所谓操作,到现在只是通过蓝 - phpStudy...
- Dubbo学习笔记(一)
- 简述linux内核中,Linux内核中的文件描述符(一)——基础知识简介
- 苹果的困境源于优质移动应用的垮台吗?
- javascript基础案例解析
- magisk核心功能模式是什么_科技板块——深入解析MM管理器
- JAVA数据结构和算法系列视频教程 20课
- photoshop2019及其破解器
- [LintCode]144. 交错正负数(献给卡在65%的你)
- java调用快捷支付接口_Android客户端集成支付宝快捷支付
- 牛顿冷却定律,衰减因子alpha
- STI、LOD与WPE概念:STI效应对SPICE Model的影响
- PHP之两个日期之间相差天数
热门文章
- 农历 阴历 转换阳历算法
- netware php_服务器_如何在 Netware 服务器中安装多块网卡,如果网络在扩大时服务器只装 - phpStudy...
- 基于搜狗新闻语料库的词向量模型训练(Windows下)
- 投资理财之基金二:购买基金的渠道
- 获取select选中的值php,js如何获取select标签选中的值
- 档案管理学川大972 | 档案信息资源开发与利用
- 【物联网开发基础】plc简介
- 怎样找到win7系统默认的微信缓存文件夹路径
- java山海经之轩辕_山海经之情剑轩辕 炼化任务详细攻略
- 交换机下接路由器lan还是wan_小白请教,自家网络搭建中,光猫、交换机、无线路由器、NAS布线问题...