Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线(实例分析)

Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线

本文主要从零开始创建一个MFC单文档工程然后逐步实现添加按键(事件响应函数),最后实现单一颜色直线的绘制与渐变色直线的绘制o( ̄▽ ̄)ブ

文章目录

  • Visual Studio 使用MFC 单文档工程从创建到实现绘制单一颜色直线和绘制渐变颜色的直线
    • 一、 使用visual Studio 创建一个MFC应用单文档工程
      • 1.1 创建新项目
      • 1.2 更改项目名称与项目位置
      • 1.3 选择应用程序的类型
    • 二、 添加绘图按钮
      • 2.1 打开资源视图
      • 2.2 添加功能按键
    • 三、 `绘图`-`直线`功能按键
    • 四、 添加自定义绘制直线的代码
      • 4.1 绘制单一颜色直线
      • 4.2 绘制渐变色直线
      • 上述代码的原理

一、 使用visual Studio 创建一个MFC应用单文档工程

1.1 创建新项目

在这里插入图片描述

在这里插入图片描述

1.2 更改项目名称与项目位置

在这里插入图片描述

1.3 选择应用程序的类型

选择应用程序的类型为单文档
在这里插入图片描述

二、 添加绘图按钮

2.1 打开资源视图

可能资源视图在右侧找不到,可以下视图中找,如下图
在这里插入图片描述

打开资源视图中Menu中的IDR_MAINFRAME 文件,可以看到一般单文档工程运行后的基本界面
在这里插入图片描述

2.2 添加功能按键

在这里插入图片描述

三、 绘图-直线功能按键

对刚刚创建的功能按键右键添加事件处理函数后就会跳转至添加的类中

在这里插入图片描述

在这里插入图片描述

创建完成后你就可以看到下面的界面
在这里插入图片描述

四、 添加自定义绘制直线的代码

绘制渐变色直线可以通过最原始也就是最简单的SetPixel()进行一个一个像素点的进行插值绘制,但是也可以使用Gdiplus库进行渐变色直线的绘制。这里只解释使用该库内的函数进行创建。

4.1 绘制单一颜色直线

在绘制渐变色之前我们可以先了解一下如何绘制单一颜色的直线

在函数中添加下面代码

CClientDC dc(this);
CPen NewPen;  
NewPen.CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
dc.SelectObject(NewPen);
dc.MoveTo(50, 150);
dc.LineTo(400, 150);

解析:

CClientDC dc(this);//创建对象dc,这个对象用于在窗口客户区进行绘图
CPen NewPen; //创建画笔对象,可用于设置画笔的属性
//PS_SOLID 实线,PS_DASH 虚线,PS_DOT 点线,PS_DASHDOT 点化线,PS_DASHDOTDOT 双点化线
NewPen.CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
dc.SelectObject(NewPen);//将画笔选入设备上下文,以便后续的绘图使用该画笔
dc.MoveTo(50, 150);//起点,移动绘图位置到 (30, 150),这是绘制线段的起点
dc.LineTo(400, 150);//终点,绘制一条直线从当前位置(上一步的终点)到 (400, 150)

实现效果:
在这里插入图片描述

4.2 绘制渐变色直线

需要使用GDI+库,所以需要

#include <Gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;

然后添加绘制渐变色的直线的代码(代码解析已经写在代码后面啦~)

// 初始化 GDI+
GdiplusStartupInput gdiplusStartupInput;//创建 GdiplusStartupInput 对象,该对象用于配置 GDI+ 的启动参数。它是一个结构体,通常可以用默认值进行初始化
ULONG_PTR gdiplusToken;  //创建一个用于标识 GDI+ 实例的令牌。这个令牌在调用 GdiplusShutdown 时用于关闭 GDI+
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);//启动 GDI+。这个函数用于初始化 GDI+ 并返回一个令牌,该令牌稍后用于关闭 GDI+
// 在花括号中创建一个 Graphics 对象,确保在离开该块时调用析构函数释放资源
{
 // 创建 GDI+ 绘图对象
 Graphics graphics(GetSafeHwnd());//该对象表示一个绘图图面,使用窗口句柄 GetSafeHwnd() 初始化。这个对象用于进行各种绘图操作

 // 定义渐变颜色
 Color color1(255, 0, 0);  // 起始颜色(红色)
 Color color2(0, 0, 255);  // 终止颜色(蓝色)

 // 创建渐变画笔
 LinearGradientBrush brush(Point(50, 150), Point(900, 150), color1, color2);

 // 画线
 graphics.DrawLine(&Pen(&brush, 4), 50, 150, 600, 150);
}

// 关闭 GDI+
GdiplusShutdown(gdiplusToken);

点击后可实现效果👇

在这里插入图片描述

上述代码的原理

这代码段主要使用了GDI+库来绘制一条渐变色直线。以下是代码的原理:

  1. 初始化 GDI+: 首先,通过创建GdiplusStartupInput对象,该对象用于配置GDI+的启动参数。然后,创建一个令牌gdiplusToken用于标识GDI+实例,这个令牌在调用GdiplusShutdown时用于关闭GDI+。最后,通过调用GdiplusStartup函数初始化GDI+,返回一个令牌。

  2. 创建 Graphics 对象: 在花括号内创建了一个Graphics对象,这个对象表示一个绘图图面。Graphics对象的初始化使用窗口句柄GetSafeHwnd()。这确保在离开花括号时,会调用Graphics对象的析构函数来释放资源。

  3. 定义渐变颜色: 使用Color对象定义两个颜色,color1表示起始颜色(红色),color2表示终止颜色(蓝色)。

  4. 创建渐变画笔: 使用LinearGradientBrush类创建一个线性渐变画笔。这需要指定渐变的起始点和终止点以及起始颜色和终止颜色。

  5. 画线: 使用graphics.DrawLine函数在绘图图面上绘制一条直线。这里使用了刚刚创建的渐变画笔,并指定了线的起始点和终止点,以及线的宽度。

  6. 关闭 GDI+: 最后,通过调用GdiplusShutdown函数关闭GDI+,传入之前获取的令牌。

补充:

LinearGradientBrush brush(Point(50, 150), Point(900, 150), color1, color2);创建一个线性渐变画笔对象,指定了渐变的起始点、终止点和颜色。注意渐变色的起点与终点与后面实际画线操作的范围

写在最后:
绘制渐变色直线是使用的GDI+库,但是同样可以使用最原始的方法一个一个像素点循环绘制(这个方法更加能够理解数字图像处理的原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/189283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用chart.js来完成动态网页显示拆线图的效果

<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><%! String list"[一月份, 二月份, 三月份,四月份, 五月份, 六月份, 七月]"; String label"我的一个折线图"; String data &qu…

RabbitMQ之MQ的可靠性

文章目录 前言一、数据持久化交换机持久化队列持久化消息持久化 二、LazyQueue控制台配置Lazy模式代码配置Lazy模式更新已有队列为lazy模式 总结 前言 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 一、…

Scrapy爬虫异步框架(一篇文章齐全)

1、Scrapy框架初识 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道&#xff08;点击前往查阅&#xff09; 4、Scrapy框架中间件&#xff08;点击前往查阅&#xff09; Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

SQL Server秘籍:数据分隔解密,数据库处理新境界!

点击上方蓝字关注我 在数据数据过程中经常会遇到数据按照一定字符进行拆分&#xff0c;而在不同版本的SQL SERVER数据库中由于包含的函数不同&#xff0c;处理的方式也不一样。本文将列举2个版本的数据库中不同的处理方法。 1. 使用 XML 方法 在SQL SERVER 2016版本之前&#x…

C#,数值计算——有理函数插值和外推(Rational_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 有理函数插值和外推 /// Rational Function Interpolation and Extrapolation /// Given a value x, and using pointers to data xx and yy, this routine returns …

2.1 总线问题

同一时间只能有一个去控制总线,因此需要一个输出开关去确保总线不出错 一旦同时开启输出开关,下面的锁存器还会被上面的数据修改如果上下同时开启可写,且同时开启可输出, 则短路

从零开始的RISC-V模拟器开发(一)环境搭建

前言 博主这系列文章是跟随中科院吴伟老师的b站公开课&#xff1a;[完结]从零开始的RISC-V模拟器开发第一季2021春季_哔哩哔哩_bilibili 记录的笔记。仅供学习使用&#xff0c;侵删&#xff01; 苦逼的博主现在自己毕设也是要设计类似的东西。哎。我需要做的是给一个现成的 R…

歌曲《难不难》由歌手荆涛演唱:面对挑战,勇敢前行

在人生的旅途中&#xff0c;我们都会遭遇种种困难和挑战。有时&#xff0c;一个看似简单的创意或想法&#xff0c;想要实现它却需要经历无数次的实践和辛酸。歌曲《难不难》由歌手荆涛演唱&#xff0c;以平实的语言和流畅的旋律&#xff0c;表达了面对困难和挑战时&#xff0c;…

01 _ 高并发系统:它的通用设计方法是什么?

我们知道&#xff0c;高并发代表着大流量&#xff0c;高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案&#xff0c;从而抵抗巨大流量的冲击&#xff0c;带给用户更好的使用体验。这些方案好似能操纵流量&#xff0c;让流量更加平稳地被系统中的服务和组件…

用友NC word.docx接口存在任意文件读取漏洞 附POC

@[toc] 用友NC word.docx接口存在任意文件读取漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使…

多线程详解(未完结)

文章目录 ⭐️写在前面的话⭐️一、线程简介1.1 进程1.2 线程1.3 多线程和多进程的区别1.4 总结 二、继承实现2.1 继承Thread类例子&#xff1a;网图下载 2.2 实现Runnable接口 (推荐)案例&#xff1a;火车站买票问题案例&#xff1a;龟兔赛跑 2.3 实现Callable接口 (了解即可)…

虚拟机可ping树莓派树莓派无法ping虚拟机 的解决办法

问题描述 在学习交叉编译的过程中&#xff0c;发现了树莓派无法ping通虚拟机的问题。所以我尝试了各种ping&#xff0c;发现&#xff1a; 虚拟机可以ping通树莓派和主机树莓派可以ping通主机主机可以ping通树莓派和虚拟机唯独树莓派没法ping通虚拟机 尝试各种方法后找到一种…

突破技术障碍:软件工程师如何应对项目中的难题?

在软件开发项目中&#xff0c;工程师常常会遇到各种技术难题。这些难题可能涉及到复杂的算法、不兼容的系统、难以预见的软件行为&#xff0c;或者其他许多方面。 以下是一些策略和方法&#xff0c;可以帮助软件工程师有效地应对这些挑战&#xff1a; 1、理解问题&#xff1a;…

王道p150 14.假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树 b的宽度(即具有结点数最多的那一层的结点个数) (c语言代码实现)

采用层次遍历的方法求出所有结点的层次&#xff0c;并将所有结点和对应的层次放在一个队列中。然后通过扫描队列求出各层的结点总数&#xff0c;最大的层结点总数即为二叉树的宽度。 /* A B C D E F …

下一代图片压缩格式 AVIF

长期以来我们都在为了在网络上使用什么样的图片格式而进行纠结。我们所熟知的或者运用到 Web 应用中的图片格式无非就是 PNG、JPG、GIF、SVG 或者 WebP。 HEIC是一种图像格式&#xff0c;上线时间还比较短&#xff0c;只有4年左右。 自iOS 11和 macOS High Sierra&#xff08…

GPS 定位信息获取(北斗星通 GPS)

GPS 定位信息获取&#xff08;1&#xff09; 首先回顾北斗星通 GPS 数据获取&#xff08;1&#xff09;~&#xff08;5&#xff09; gps_pub.cpp 将接收到的串口数据转化为GPS的经纬度信息gps_path.cpp 将经纬度信息转化为全局坐标系下的XY值&#xff0c;以第一个GPS经纬度为…

快递批量查询高手软件,让你轻松掌握多家快递物流信息,提升工作效率

随着电子商务的繁荣和智能化物流的普及&#xff0c;快递行业在全球范围内迅速发展。在这个快节奏的时代&#xff0c;为了提高工作效率并更好地管理物流信息&#xff0c;一款强大的工具——快递批量查询高手软件应运而生。这款软件可以让你轻松掌握多家快递公司的物流信息&#…

C++ 实现位图

引出 面试题&#xff1a;给出 40 亿个不重复的无符号整数&#xff0c;没有排过序。给定一个无符号整数&#xff0c;如何快速判断这个数是否在这 40 亿个无符号整数中。[ 腾讯面试题 ] 想法一&#xff1a;将 40 亿个数据存放到 set 里面&#xff0c;然后再查找指定的无符号整数。…

PyCharm 安装插件Vue

一、打开PyCharm工具 File -> Settings -> Plugins 二、在项目中添加Vue.js的依赖项。 npm install vue 三、页面应用

Innux(特殊位与权限)

特殊位与权限 目录&#xff1a; 1. SUID 2. SGID 3. SBIT 4. 文件系统属性chattr权限 5. 管理员权限sudo 1. SUID 1.1 什么是SUID SUID只对二进制可执行文件才有效&#xff08;文件必须具备x权限&#xff09; 执行者对该程序有 x 权限 当前程序拥有SUID时&#xff0…