visual Studio MFC 绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、边框渐变的正方形与填充渐变的正方形实例

MFC 绘制三角形

本文使用visual Studio MFC 平台实现绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、边框渐变的正方形与填充渐变的正方形.
关于基础工程的创建请参考Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线

文章目录

  • MFC 绘制三角形
    • 一、 绘制单一颜色三角形
    • 二、 绘制边框颜色渐变的三角形
    • 三、 绘制填充渐变色三角形
    • 四、绘制渐变色边框正方形
    • 五、绘制渐变色填充正方形

一、 绘制单一颜色三角形

通过dc.Polygon(pt, 3)绘制多边形.
在MFC(Microsoft Foundation Classes)中,dc.Polygon 函数用于在设备上下文(Device Context)中绘制多边形。这个函数的原型如下:

BOOL Polygon(const POINT* lpPoints,int nCount
);

参数解释:

  • lpPoints: 一个 POINT 结构体数组,表示多边形的顶点。每个 POINT 结构体包含 x 和 y 坐标,定义了多边形的一个顶点。
  • nCount: 顶点的数量。

返回值:

  • 如果函数成功,则返回非零值;如果函数失败,则返回零。

这个函数用给定的顶点数组在设备上下文中绘制一个多边形。代码片段中,pt[3] 是一个包含三个 CPoint 结构体的数组,表示一个三角形的三个顶点。然后,dc.Polygon(pt, 3) 调用绘制三角形。

CClientDC dc(this);
CPen pen(PS_SOLID, 4, RGB(255,182,193));//RGB(138, 100, 226) 表示紫罗兰色
CPen* oldPen = dc.SelectObject(&pen);//选择当前设备上下文的画笔为 pen,并将之前的画笔保存在 oldPen 中。这是为了在绘制完成后恢复原来的画笔
CPoint pt[3] = { CPoint(400,70),CPoint(800,70), CPoint(340,400) };//表示一个三角形的三个顶点坐标
dc.Polygon(pt, 3);// 使用 dc 绘制一个多边形,多边形的顶点由 pt 数组指

'CPen pen(PS_SOLID, 4, RGB(255, 182, 193))'

  • CPen是MFC中表示画笔的类。
  • PS_SOLID表示画笔风格为实线,4表示线宽,RGB(255, 182, 193)表示颜色为紫罗兰色。

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

二、 绘制边框颜色渐变的三角形

使用 DrawLines 函数绘制了连接三个顶点的线条,从而形成了一个空心的三角形。画笔 Pen 使用渐变画刷作为颜色,实现了渐变色的效果.

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;//标识符号
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
{// 创建 GDI+ 绘图对象Graphics graphics(GetSafeHwnd());// 定义三个渐变色Color color1(255, 255, 0);  // 黄色Color color2(0, 255, 255);  // 青色Color color3(255, 0, 255);  // 粉色// 创建渐变画笔LinearGradientBrush brush(Point(0, 0), Point(800, 400), color1, color2);REAL positions[] = { 0.0f, 1.0f };Color colors[] = { color1, color2 };brush.SetInterpolationColors(colors, positions, 2);// 创建画笔Pen pen(&brush, 3);// 定义三角形的三个顶点PointF points[4] = { PointF(400.0f, 100.0f), PointF(800.0f, 100.0f), PointF(400.0f, 400.0f), PointF(400.0f, 100.0f) };// 使用画笔绘制空心的渐变色边的三角形graphics.DrawLines(&pen, points, 4);}
// 关闭 GDI+
GdiplusShutdown(gdiplusToken);

补充说明

  • LinearGradientBrush:表示线性渐变画笔的类。
  • brush:创建的渐变画笔对象。

参数说明:

  • Point(0, 0):渐变的起始点,这里是窗口坐标 (0, 0)。
  • Point(800, 400):渐变的终止点,这里是窗口坐标 (800, 400)。
  • color1:起始颜色。
  • color2:终止颜色。

这段代码的作用是创建一个从起始点 (0, 0) 到终止点 (800, 400) 的线性渐变,颜色从 color1(起始颜色)变化到 color2(终止颜色)。这样的渐变将用于后续的绘图操作,例如在绘图对象上绘制形状时,形状的颜色将沿着这个线性渐变进行变化。

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

三、 绘制填充渐变色三角形

使用 FillPolygon 函数绘制了一个填充的渐变色三角形。画刷 brush 使用LinearGradientBrush 实现了渐变色的效果,然后通过 FillPolygon 函数填充三角形

// 创建 GDI+ 绘图对象
Graphics graphics(GetSafeHwnd());// 定义三个渐变色
Color color1(255, 255, 0);  // 黄色
Color color2(0, 255, 255);  // 青色
Color color3(255, 0, 255);  // 粉色// 创建渐变画刷
LinearGradientBrush brush(Point(0, 0), Point(1000, 1000), color1, color2);REAL positions[] = {0.0f, 1.0f};
Color colors[] = {color1, color2};
brush.SetInterpolationColors(colors, positions, 2);// 定义三角形的三个顶点
PointF points[3] = {PointF(400.0f, 100.0f), PointF(800.0f, 100.0f), PointF(400.0f, 400.0f)};// 使用渐变画刷填充三角形
graphics.FillPolygon(&brush, points, 3);

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

四、绘制渐变色边框正方形

如果你想绘制边框为渐变色的正方形,可以使用 DrawPolygon 函数,并指定 Pen 对象为渐变画笔。

// 创建 GDI+ 绘图对象
Graphics graphics(GetSafeHwnd());// 定义两个渐变色
Color color1(255, 0, 0);  // 红色
Color color2(0, 0, 255);  // 蓝色// 创建渐变画刷
LinearGradientBrush brush(Point(0, 0), Point(100, 100), color1, color2);REAL positions[] = {0.0f, 1.0f};
Color colors[] = {color1, color2};
brush.SetInterpolationColors(colors, positions, 2);// 定义正方形的四个顶点
PointF points[4] = {PointF(100.0f, 100.0f), PointF(200.0f, 100.0f), PointF(200.0f, 200.0f), PointF(100.0f, 200.0f)};// 创建渐变画笔
Pen gradientPen(&brush, 5.0f);  // 5.0f 是画笔的宽度// 使用渐变画笔绘制正方形的边框
graphics.DrawPolygon(&gradientPen, points, 4);

在这个例子中,我们使用 DrawPolygon 函数绘制了正方形的边框,并且使用 Pen 对象 gradientPen 设置了渐变画笔。 Pen 的构造函数接受一个 Brush 对象,这里我们使用 LinearGradientBrush 作为画笔的颜色。

实现效果图.

在这里插入图片描述

五、绘制渐变色填充正方形

要绘制一个填充的正方形,你可以使用 FillRectangle 函数。以下是一个示例代码片段:

// 创建 GDI+ 绘图对象
Graphics graphics(GetSafeHwnd());// 定义两个渐变色
Color color1(255, 0, 0);  // 红色
Color color2(0, 0, 255);  // 蓝色// 创建渐变画刷
LinearGradientBrush brush(Point(0, 0), Point(100, 100), color1, color2);REAL positions[] = {0.0f, 1.0f};
Color colors[] = {color1, color2};
brush.SetInterpolationColors(colors, positions, 2);// 定义正方形的位置和大小
RectF rectangle(100.0f, 100.0f, 100.0f, 100.0f);// 使用渐变画刷填充正方形
graphics.FillRectangle(&brush, rectangle);

在这个例子中,我们使用 FillRectangle 函数绘制了填充的正方形,并且使用 LinearGradientBrush 作为画刷的颜色。 Brush 的构造函数接受两个点,这里我们使用 Point(0, 0)Point(100, 100) 定义了一个渐变的范围。

实现效果图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO和NIO的区别 BIO,NIO,AIO 有什么区别? Files的常用方法都有哪些?

文章目录 IO和NIO的区别BIO,NIO,AIO 有什么区别?Files的常用方法都有哪些? 今天来对java中的io, nio, bio, aio进行了解,有何区别。 IO和NIO的区别 NIO与IO区别 IO是面向流的,NIO是面向缓冲区的Java IO面向流意味着每次从流中读一个或多个字…

《经济学人》深度解析之OpenAI董事会风波

上周全球最受瞩目的财经事件莫过于如日中天的OpenAI董事会风波所带来的反转之反转剧情。 故事的结局相信大家都已知悉:OpenAI在开除创始人山姆奥特曼(Sam Altman)几天后,重新任命他为首席执行官,并成立了一个新的董事…

linux LVM /dev/sdb mount dir /data【linux LVM 磁盘挂载目录】

添加磁盘 /dev/sdb rootregistry01 ~]# fdisk -lDisk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk lab…

机器学习(1)机器学习类型和机器学习的主要概念

0.前提 深度学习(Deep Learing)是机器学习(Machine Learning)领域中的一个新的研究方向,在如今的时代研究深度学习的大模型是十分热门的。我不知道有多少人有关注到最近openai的事件啊,说个比较让我惊讶的…

系列十八、Spring bean线程安全问题

一、概述 我们知道Spring中的bean,默认情况下是单例的,那么Spring中的bean是线程安全的吗?这个需要分情况考虑,bean中是否存在成员变量?bean中的成员变量是怎么处理的?...,针对bean的状态会有不…

FaceChain集成最强开源SDXL,生成人像质感拉满!

一、介绍 FaceChain,一款备受欢迎的AI写真开源项目,目前已与最强大的开源生图模型SDXL完美融合!这将为用户带来前所未有的高质量AI写真体验。 FaceChain是一个可以用来打造个人数字形象的深度学习模型工具。用户仅需要提供最低一张照片即可获…

vue.js如何根据后台返回来的图片url进行图片下载

原创/朱季谦 最近在做一个前端vue.js对接的功能模块时,需要实现一个下载图片的功能,后台返回来的是一串图片url,试了很多种方法,发现点击下载时出来的效果,都是跳到一个新的图片网页,后来经过一番琢磨&…

『Linux升级路』基础开发工具——make/Makefile

🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识make/Makefile 📒1.1make/Makefile的优点 📒…

基于C#实现鸡尾酒排序(双向冒泡排序)

通俗易懂点的话,就叫“双向冒泡排序”。 冒泡是一个单向的从小到大或者从大到小的交换排序,而鸡尾酒排序是双向的,从一端进行从小到大排序,从另一端进行从大到小排序。 从图中可以看到,第一次正向比较,我们…

交流回馈负载的主要工作方式

交流回馈负载是一种电力电子装置,其主要工作方式是将电能从交流电源转换为直流电,然后再将直流电转换为交流电。这种转换过程是可逆的,因此可以用于调节电网的电压和频率,提高能源利用效率,减少能源浪费。 交流回馈负载…

浅谈智能照明控制系统在建筑电气工程中的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:建筑电气工程是项目工程中的重要组成部分,其对技术、电气设备及系统的要求较高。在信息化技术不断深入推广的新时期,建筑电气工程中的照明系统获得新的发展契机,为了满足现…