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

简介

这次试验具有一定难度,因为我们对于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)
    {

    }
} 

}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值