苹果IOS 12推出的测距仪功能,在没有尺子的情况下,能够粗略的利用手机获得距离长度,获得用户的好评。请利用所学的桌面应用开发知识,仿照完成一个类似测距仪功能的小软件,功能要求如下所示,最终效果见Demo文件夹:
软件需求及编码提示:
该软件只需要一个窗体,该窗体名称为FrmDistanceMeasure, 该窗体标题为“测距仪”, 窗体大小为500*780。
首先利用Graphics对象的DrawImage( )方法,将所需测量距离的图片显示出来, 相关代码如下:测试上述编码之前,请确认yaoming.jpg文件已保存到项目所在的bin文件夹下。运行上述代码,成功后,你会看到窗体中显示了一张姚明的图片。
通过为该窗体添加相关事件,结合GDI+中的Graphics对象,实现测距以及距离展示功能。具体方法如下:
当用户鼠标按下的时候,以点击点位置为中心绘制一个填充颜色为白色,半径为10个像素的填充圆;并以点击点位置为中心绘制一个颜色为白色,虚线类型为划线,半径为20的轮廓圆。
当用户鼠标移动的时候,以点击点位置为中心绘制一个填充颜色为白色,半径为10个像素的填充圆;并以点击点位置为中心绘制一个颜色为白色,虚线类型为划线,半径为20的轮廓圆。并且在两个点之间绘制一条颜色为白色,宽度为3的直线。
定义两个Point对象,clickPoint, movePoint,用于分别记录鼠标点击下去的点的坐标,以及鼠标移动到的点的坐标。
定义一个double类型的distance变量,用于计算出真实的物理距离。利用两点之间的距离公式,可以计算出点击点与移动点的像素距离。上述像素距离*0.34, 就能换算出实际的物理长度,以cm为单位。具体公式如下所示:
distance=√((x_2-x_1 )^2+(y_2-y_1 )^2 )*0.34
得到上述距离信息后, 在Paint事件中, 利用Graphics对象的DrawString( )方法,将上述距离信息,显示在窗体的左上角,具体代码如下:(其中 “f0”,表示保留0位小数)
代码部分:
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 practice8
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
bool isdown = false;
Graphics g;
Point cpt;
Point mpt;
double distance = 0;
double i = 0;
private void Form1_Paint(object sender, PaintEventArgs e)
{
Pen p = new Pen(Color.White);
p.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
g = e.Graphics;
Image img = Image.FromFile("yaoming.jpg");
g.DrawImage(img, 0, 0);
g.FillEllipse(Brushes.White, cpt.X - 5, cpt.Y - 5, 10, 10);
g.DrawEllipse(p, cpt.X - 10, cpt.Y - 10, 20, 20);
g.FillEllipse(Brushes.White, mpt.X - 5, mpt.Y - 5, 10, 10);
g.DrawEllipse(p, mpt.X - 10, mpt.Y - 10, 20, 20);
g.DrawLine(Pens.White,cpt,mpt);
i=(cpt.X-mpt.X)*(cpt.X-mpt.X)+(cpt.Y-mpt.Y)*(cpt.Y-mpt.Y);
distance = Math.Sqrt(i) * 0.34;
g.DrawString(distance.ToString("f0") + "cm", this.Font, Brushes.White, 0, 0);
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
isdown = true;
cpt.X = e.X;
cpt.Y = e.Y;
this.Invalidate();
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
isdown = false;
mpt.X = e.X;
mpt.Y = e.Y;
this.Invalidate();
}
}
}
运行结果:
只需要在bin文件中更改想要测的图片即可