简介

这次试验具有一定难度,因为我们对于C#得画板接触得比较少,但是我认为老师很可能在考试的时候在这上面大出文章,所以这个实验我会详细的解析C#的GDI+

首先,我们要画图形,就要调用Paint方法,如果在MouseMove里面画,那么在鼠标移动的时候就会一直画,同时出现很多个我们想要画的东西,但是这次练习要求只要画五个东西,第一个是MouseDown的时候,我们获得此时鼠标点击的坐标,同时我们鼠标移动,一边移动鼠标的坐标也在不断得变化,就如上文所说,如果在MouseMove这个方法里面画图形,那么随着鼠标得移动,它会一直画,所以就会出现白色覆盖图片得效果,最后出现无法完成实验要求,所以我们这道练习得把画图形这个功能写在Paint里面,我们只从MouseDown和MouseMove里面获取鼠标得坐标,然后在Paint方法里面调用,这样就只画了我们实验要求得五个东西(两个实心圆,两个虚线圆,一条直线),我们通过鼠标得两个坐标来画,圆得半径已经给了,两点确定一条直线,所以我们能通过这些东西画出来。这个是实验得基本思路,下面给出详细过程

这里有一个重要概念,我们的程序只会在载入的时候调用一次Paint方法,后续是不会再调用的,想要调用就要用invalidata();这个方法来调用,所以我们思考一下,什么时候我们会去画呢,第一次是我们鼠标点下去的时候,所以我们要在MouseDown的时候调用一次这个方法,还有就是再MouseMove的时候,我们的画板一直在随着movePoint的移动而更新,所以我们在MouseMove里面也需要调用这个方法

苹果IOS 12推出的测距仪功能,在没有尺子的情况下,能够粗略的利用手机获得距离长度,获得用户的好评。请利用所学的桌面应用开发知识,仿照完成一个类似测距仪功能的小软件,功能要求如下所示,最终效果见Demo文件夹:
软件需求及编码提示:
该软件只需要一个窗体,该窗体名称为FrmDistanceMeasure, 该窗体标题为“测距仪”, 窗体大小为500*780。
首先利用Graphics对象的DrawImage( )方法,将所需测量距离的图片显示出来, 相关代码如下:测试上述编码之前,请确认yaoming.jpg文件已保存到项目所在的bin文件夹下。运行上述代码,成功后,你会看到窗体中显示了一张姚明的图片。//这里老师文档里面有了错误,应该放在bin/Dubug文件夹里面,可能是版本得更新,注意FromFile里面也 可以写绝对路径,老师要求我们写得是相对路径,它默认是从bin/Debug开始写得,绝对路径就是@“D:\C#\PractiseDesk\DeskApplication\DistanceMeasure\bin\Debug”

而我们如果快速找到这个文件夹呢,我们可以右键点击项目,然后选择在资源管理器中打开项目:

然后会出现这么一个文件夹,然后点击进入bin文件

里面会有一个Debug文件,然后再点击进去,就可以看到

可以看出我们得exe文件也在这里,那我们不难理解,当我们点击运行得时候,VS就在这个bin文件里面运行了这个exe文件,所以默认得相对路径就是在这个文件夹下面,所以我们要把照片放在这个文件夹下面!!!
通过为该窗体添加相关事件,结合GDI+中的Graphics对象,实现测距以及距离展示功能。具体方法如下:
当用户鼠标按下的时候,以点击点位置为中心绘制一个填充颜色为白色,半径为10个像素的填充圆;并以点击点位置为中心绘制一个颜色为白色,虚线类型为划线,半径为20的轮廓圆。
float[] Pts = { 3,1,2,5};
p2.DashStyle = DashStyle.Dash;
p2.DashPattern = Pts; 就是指画短划线的时候,第一笔长3个单位,空白1个单位,接下来长2个单位,再空5个单位,如此循环。

p2是我们定义得笔,通过上面可以让它画出虚线得东西,这个是方便大家理解这个东西,在我的项目里我是这样设定的:
Pen pen = new Pen(Color.White);
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom;
pen.DashPattern = new float[] { 5, 5 };
也就是说,我的虚线是均匀的,画五个长度后空白五个长度

当用户鼠标移动的时候,以点击点位置为中心绘制一个填充颜色为白色,半径为10个像素的填充圆;并以点击点位置为中心绘制一个颜色为白色,虚线类型为划线,半径为20的轮廓圆。并且在两个点之间绘制一条颜色为白色,宽度为3的直线。
画圆的代码我会在下面的代码里面 进行解释
定义两个Point对象,clickPoint, movePoint,用于分别记录鼠标点击下去的点的坐标,以及鼠标移动到的点的坐标。
定义一个double类型的distance变量,用于计算出真实的物理距离。利用两点之间的距离公式,可以计算出点击点与移动点的像素距离。上述像素距离*0.34, 就能换算出实际的物理长度,以cm为单位。具体公式如下所示:
distance=√((x_2-x_1 )^2+(y_2-y_1 )^2 )*0.34
*代码:Double distance = Math.Sqrt((clickPoint.X - movePoint.X) * (clickPoint.X - movePoint.X) + (clickPoint.Y - movePoint.Y) * (clickPoint.Y - movePoint.Y))0.34;
得到上述距离信息后, 在Paint事件中, 利用Graphics对象的DrawString( )方法,将上述距离信息,显示在窗体的左上角,具体代码如下:(其中 “f0”,表示保留0位小数)

最终实现效果如下图所示:


码字不易,看后学到东西记得点赞加关注,有不懂的或者我错误需要改进的地方请评论区留言,或者加我小号qq:2417438647

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DistanceMeasure
{
public partial class FrmDistanceMeasure : Form
{
public FrmDistanceMeasure()
{
InitializeComponent();
}
Graphics g;
Point clickPoint;//先定义两个坐标
Point movePoint;
bool isPaint = false;
bool isPaintStop = false;
private void FrmDistanceMeasure_Paint(object sender, PaintEventArgs e)
{
g = e.Graphics;
Image img = Image.FromFile(“yaoming.jpg”);
g.DrawImage(img, 0, 0);
if (isPaint)//判断是否鼠标是按下状态,按下状态就是还在画
{
Brush brush = new SolidBrush(Color.White);
Pen pen = new Pen(Color.White);
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom;//让笔画虚线
pen.DashPattern = new float[] { 5, 5 };

            g.FillEllipse(brush, clickPoint.X - 10, clickPoint.Y - 10, 20, 20);g.DrawEllipse(pen, clickPoint.X - 20, clickPoint.Y - 20, 40, 40);g.FillEllipse(brush, movePoint.X - 10, movePoint.Y - 10, 20, 20);g.DrawEllipse(pen, movePoint.X - 20, movePoint.Y - 20, 40, 40);g.DrawLine(new Pen(Color.White, 3), clickPoint, movePoint);}if (isPaintStop)//判断鼠标是否抬起,如果抬起则movePoint这个坐标不变,同时计算出两点之间距离,换算成cm,并且把这个距离显示出来{Double distance = Math.Sqrt((clickPoint.X - movePoint.X) * (clickPoint.X - movePoint.X) + (clickPoint.Y - movePoint.Y) * (clickPoint.Y - movePoint.Y))*0.34; //距离换算g.DrawString(distance.ToString("f0") + "cm", this.Font, Brushes.White, 0, 0);}}private void FrmDistanceMeasure_MouseDown(object sender, MouseEventArgs e){isPaint = true;clickPoint = new Point(e.X, e.Y);//鼠标点下,把此时鼠标的坐标传递过去Invalidate();}private void FrmDistanceMeasure_MouseMove(object sender, MouseEventArgs e){if (!isPaintStop) {//如果鼠标按下还没有停止,那么一直更新movePoint的坐标,我们根据这个坐标来画圆,因为这个坐标只有一个,所以我们只会画出一个圆,而如果在这里面写画图形的方法,我们会画出无数个圆,希望能够理解。(PS:其实这里一个bool变量isPaint就能控制,用两个变量可以增大代码的健壮性,方便后续写入功能)movePoint = new Point(e.X, e.Y);Invalidate();//调用方法是为了调用Paint方法}}private void FrmDistanceMeasure_MouseUp(object sender, MouseEventArgs e){isPaintStop = true;Invalidate();}private void FrmDistanceMeasure_Load(object sender, EventArgs e){}
}

}

(重点)C#/Csharp桌面应用开发小作业小程序,测距仪,画圆,GDI画圆,画直线,绘制圆,绘制直线,绘制虚线,dashpattern的应用相关推荐

  1. C#/Csharp桌面应用开发小作业小程序,类似微信登录功能的小软件

    (七) 微信APP是一款非常流行的及时通讯类应用软件,请利用所学的桌面应用开发知识,仿照完成一个类似微信登录功能的小软件,功能要求如下所示,最终效果见Demo文件夹: 软件需求及编码提示:  该软件 ...

  2. 【猿如意】为开发者提高效率的利器,称心如意的桌面辅助开发工具

    目录 先说结论,猿如意,一款值得下载的辅助开发工具 一.猿如意简介 二.效率工具测评 1. json 格式化 2. hosts 切换 3. 其他 三.效率工具使用体验及改进建议 1. 点击运行长时间无 ...

  3. 安卓开发大作业_罗湖小程序开发制作价格低

    罗湖小程序开发制作价格低 深圳市驰骋网络技术有限公司 驰骋网络提供外观结构设计+软硬件+APP+云服务 一站式开发服务 小程序开始走入了人们的视线,由于其独特的便捷性,给我们的生活提供了非常大的帮助, ...

  4. 基于JavaSwing开发吃豆子小游戏 课程设计 大作业源码

    基于JavaSwing开发吃豆子小游戏:   (大作业) 开发环境: Windows操作系统 开发工具: MyEclipse/Eclipse/idea+Jdk 运行效果图: 基于JavaSwing开发 ...

  5. 基于JavaSwing开发潜艇大战小游戏 课程设计 大作业源码

    基于JavaSwing开发潜艇大战小游戏:  (大作业) 开发环境: Windows操作系统 开发工具: Eclipse+Jdk 运行效果图: 基于JavaSwing开发潜艇大战小游戏:  (大作业) ...

  6. ArcEngine C# GIS开发入门作业 (三)Ex04——实现地图的简单渲染和唯一值渲染

    文章评论 写评论 sinat_37432938: 可以说非常有参考的意义,谢谢分享 4周前 #2楼 举报回复查看回复(1) domen_dragon 回复 sinat_37432938: 哈哈,谢谢夸 ...

  7. CEF 桌面软件开发实战

    作者介绍 刘晓伦liulun,资深桌面端开发工程师.目前在一家大型国有控股上市公司任职,主要负责桌面端产品的核心技术研发.重难点技术攻关,以及新技术的预研和技术储备工作,拥有十几年的软件开发经验,在 ...

  8. AndroidStudio开发----图案竞猜小程序

    AndroidStudio开发----图案竞猜小程序 基于安卓期中作业的要求,做一个图案竞猜小游戏,代码基础不是很好,谨慎借鉴! 内容要求: (1) app首页启动后布局效果如图1-1所示,上方四个白 ...

  9. 大学生应该怎样选择路线(桌面应用开发,服务后台,游戏开发)

    大学生究竟应该怎样选择路线 不同选择造成最明显刚进入大学,我们可能会很迷茫. 我们现在可能很迷茫,我要干什么? 实验室?学生会?社团? 我将来要选择的是考研,还是就业?是创业,还是转行? 我们选择计算 ...

最新文章

  1. android透明视频教程,安卓透明教程(Android transparent tutorial).doc
  2. 2.oracle的安装常识,Oralce服务器,oracle集群,oracle服务介绍,用户解锁相关
  3. 【UOJ207】共价大爷游长沙【LCT】【异或】【随机化】
  4. 战术网络安全检查表 | Symantec Connect
  5. 从数据库层面手动删除zabbix告警
  6. 基于asp.net2 C#开发MapServer
  7. python飞机大战源码素材包_Python飞机大战实战项目案例
  8. Pem私钥pkcs1和pkcs8之间互转
  9. 编程分钟转化小时怎么编_贴片机编程教程,编程步骤,编程怎么编
  10. 1597: [Usaco2008 Mar]土地购买 斜率优化
  11. 上热搜!武大学生用Python敲出樱花开放 | 附源码
  12. TestFlight Beta 相关问答
  13. 【华为联机对战服务】如何保存及查看联机对战SDK日志?
  14. git 账号密码重置
  15. win10 启动自动修复失败
  16. Python 选择与循环
  17. windows 远程连接 快捷键
  18. 对前端的一些粗浅的认识
  19. 打分五角星html制作,css简单实现五角星评分、点赞收藏、展示评分(半颗星、1/3颗星)...
  20. Hibernate中:cannot simultaneously fetch multiple bags的问题

热门文章

  1. 华为交换机 查ip冲突_交换机如何设置控制IP地址冲突故障
  2. NBA Finals
  3. c语言设置制表符参数,printf()函数的参数和制表符
  4. 线序检测视觉算设计过程及效果展示
  5. 更新桌面图标缓存,解决桌面白图标问题
  6. docusign文档打不开_DocuSign可让您以电子方式签署文件 | MOS86
  7. 智能巡检机器人打造无人值守智慧车站
  8. c语言十进制数转二进制数
  9. 怎么关DELL笔记本触摸板
  10. 谈谈GC垃圾回收—什么是垃圾,垃圾回收算法,垃圾收集器