01. 基于MFC绘制一个彩色正方形

article/2025/10/22 15:20:04

本博文内容是博文基于MFC框架的图像缩放算法示例的一部分(返回目录)。

MFC(Microsoft Foundation Classes)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架以减少应用程序开发人员的工作量。

这里不详细介绍MFC框架,相关信息可以自己搜索。本项目的开发平台是Visal Studio Community 2022版,注意MFC组件不是默认安装的,需要手动配置安装。

下面是基于MFC框架建立一个GUI(Graphic User Interface,图形用户接口)程序的步骤。

MFC可以生成单文档多文档基于对话框的GUI程序,我们的项目使用单文档程序作为示例。废话少说,直接上图。

step 01: 创建新的Visual Studio工程

在这里插入图片描述

step 02: 选择工程类型为MFC应用

在这里插入图片描述

step 03: 指定项目名称并选择项目的保存位置

在这里插入图片描述

step 04: 选择MFC应用类型-单文档

在这里插入图片描述
选择好项目类型后,其他设置可以不修改,一直点击【下一步】直到完成项目创建,可以看到如下图所示界面。

step 05: 观察生成的单文档程序框架

在这里插入图片描述
项目创建完成后,Visual Studio为我们创建了一个完成的程序框架,也就是不用编写一行代码就可以运行一个完整的程序。点击下图中【本地Windows调试器】按钮,经过一段时间编译和构建,会自动运行如下图所示框架程序。

step 06: 运行第一个MFC程序

在这里插入图片描述

step 07: MFC单文档程序结构简介

MFC单文档程序结构主要涉及四个核心类的对象,每个类的源码由一个类的头文件*.h和对应类的实现文件*.cpp组成。

(1)应用程序类CApp:负责处理消息,将收到的消息分发给相应的对象,是应用程序的最顶层模块。(下图右侧的MFC_SD_01.h和MFC_SD_01.cpp)

(2)主框架类CMainFrame:是视图CView的父窗口,视图CView类的对象就显示在CMainFrame类对象的客户区中。(下图右侧的MainFrm.h和MainFrm.cpp)

(3)视图类CMFC_SD_01View:用来显示文档类CTestDoc中的数据,并根据对视图类的操作修改文档类的数据。(下图右侧的MFC_SD_01View.h和MFC_SD_01View.cpp)

(4)文档类CMFC_SD_01Doc:用来保存和处理数据,一般具体的算法可以放在这里。一个视图类只能跟一个文档类相联系,而一个文档类可以跟多个视图类相联系。(下图右侧的MFC_SD_01Doc.h和MFC_SD_01Doc.cpp)
在这里插入图片描述
为简单起见,目前我们仅在CMFC_SD_01View类中添加我们的自定义代码。下面我们开始编写绘制正方形的代码,为了便于后面绘制图像的用途,我们选择一个很简单的函数来完成正方形的绘制,即基于Windows GDI库的SetPixel()函数绘制一个彩色正方形。

step 08: 在消息响应函数OnDraw()中添加绘制彩色正方形代码

在这里插入图片描述
点击右侧栏的MFC_SD_01View.cpp,打开CView类的实现文件,找到OnDraw()函数,这是一个消息响应函数,即在应用程序的界面需要更新(包括启动时,移动或隐藏再显示等操作)操作系统会发送相关的消息我们的应用程序,程序就会调用OnDraw()函数处理相关的绘制工作,当然这里包括用户区的绘制,也就是step06显示的界面中间大片空白区域。

//void CMFCSD01View::OnDraw(CDC* /*pDC*/)
void CMFCSD01View::OnDraw(CDC* pDC)
{CMFCSD01Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码//1.使用DC在指定坐标(x=150,y=200)位置绘制一个红色的点,颜色由RGB宏指定pDC->SetPixel(150, 200, RGB(255, 0, 0));//2.调用SetPixel函数绘制一个颜色渐变的正方形//  正方形边长为255像素,左上角坐标(100,100)for (int i = 0; i < 256; i++) {pDC->SetPixel(100,		100+i, RGB(255, 0, 0));		//红色pDC->SetPixel(100+255,	100+i, RGB(255,0, 255));	//混合色pDC->SetPixel(100+i, 100+255, RGB(0, 255, 0));		//绿色pDC->SetPixel(100+i, 100,     RGB(0, 0, 255));		//蓝色}
}

上面的代码在OnDraw()函数内添加绘制一个正方形的代码,也就是在程序启动或需要更新界面的时候就会调用这部分代码绘制相应的图形。

有几个地方需要注意的,原OnDraw()包含一个参数是默认被注释了(CDC* /*pDC*),也就是这个pDC是不能使用的,而我们的代码正好用到的就是这个CDC类的对象指针,所以需要取消原函数的注释,修改为(CDC* pDC)才能在函数内部使用pDC。// TODO:下面才是我们自己编写的代码,上面的部分是应用程序框架生成的时候系统添加的,无需改动。

CDC(DC:设备上下文)类是Window提供的GDI(图形设备接口)的一个绘制图像的重要工具,这里我们不具体讨论,有兴趣的同学可以自己搜索学习相关内容。我们的工程仅仅用到其中的一个函数SetPixel(),它的函数原型如下所示,功能是在用户工作区的指定坐标位置int x,int y绘制一个指定颜色COLORREF crColor的点。

COLORREF CDC::SetPixel(int x,int y,COLORREF crColor);

坐标位置好理解,x代表横坐标,y代表纵坐标,需要注意是绘图坐标系的原点是在用户工作区的左上角,而y的正方向向下,与一般的直角坐标系(即笛卡尔坐标系)不同。

指定颜色COLORREF时我们使用RGB宏,即颜色由Red,Green和Blue三种不同分量(0~255表示)的单色混合成各种五彩缤纷的颜色,例如RGB(255,0,0)代表纯红色,RGB(255,0, 255)代表红色和蓝色的混合色,其他类似。

因为pDC是一个指针,所以调用它的方法要用指针的引用方式,即pDC->SetPixel(...),每调用一个这个函数就会绘制一个点,而一条直线由多个点组成,一个正方形由四条直线段构成,因此我们用了一个for循环来完成绘制操作,大家可以参考源码仔细体会。

step 09: 运行我们的彩色正方形程序

再次点击Visual Studio的【本地Windows调试器】按钮,经过一段时间编译和构建,会自动运行显示下图所示图形界面。可以看到在用户绘制了一个有四个不同颜色的边构成的正方向和一个红色的点(不易看到,图中用灰色手绘圆圈进行了重点标记!!!)
在这里插入图片描述
到此为止,我们利用CDC类的SetPixel函数成功绘制了一个彩色正方形。需要指出的是,这里使用的SetPixel方法是比较笨的方法,目的是为后面讨论绘制BMP图像的单个像素打基础。CDC还有其他更方便的函数绘制线条,比如LineTo()等,大家可以自己学习,这里不再赘述。

自我练习

学完如何基于Visual Studio的MFC框架搭建一个单文档的GUI程序,并在消息响应函数OnDraw()利用系统提供的绘图工具CDC* pDC绘制一个彩色正方形,大家以在以上程序的基础稍作修改就可以绘制多种多样的程序。比如:

  1. 绘制一个圆
  2. 绘制一个正弦波形
  3. 绘制一个带直角坐标,并在不同位置绘制圆,三角形,矩形,正方形,三角函数波形等。

http://chatgpt.dhexx.cn/article/yil0qPg0.shtml

相关文章

CSS实现正方形

正方形 以前有人问我怎么实现一个正方形&#xff0c;我就很纳闷&#xff01;把块属性width和height设置成一样不就好了吗&#xff01; //这不就是个正方形 .div {width:100px;height:100px }但这不是他想要的答案。也许是考虑到自适应的问题吧。 于是&#xff0c;我想到了最…

“最大正方形”

描述 给定一个由0和1组成的2维矩阵&#xff0c;返回该矩阵中最大的由1组成的正方形的面积&#xff0c;输入的矩阵是字符形式而非数字形式。 数据范围&#xff1a;矩阵的长宽满足 0 \le n \le 200≤n≤20,矩阵中的元素属于 {1,0} 进阶&#xff1a;空间复杂度 O(n^2)O(n2) &am…

无角正方形的绘制

from turtle import* for i in range(3):pu()fd(50)pd()fd(100)pu()fd(50)lt(90) pu() fd(50) pd() fd(100) done()

图形学中画正方形的几种方式

1&#xff09;利用三角形列绘制一个正方形 顺时针划线&#xff0c;每个点都是单个数据源&#xff0c;只能单词使用。因此两个三角形需要六个点&#xff08;哪怕重合也需要六个点&#xff09; 2&#xff09;利用三角形带绘制一个正方形 四个点可组成两个三角形&#xff0c;第一个…

css画个正方形

css画个正方形 方式1方式2html效果参考 方式1 /* 兼容性好 */ .use-transform {width: 10%;height: 0;padding-bottom: 10%;border: 1px solid #000; }方式2 使用 vw: 为什么不用%&#xff1f; % 是相对于父元素的大小设定的比率&#xff0c;body默认的宽度为视窗的宽度&…

怎么用数学绘图软件制作正方体展开动画?

正方体是一个基本的空间几何图形&#xff0c;也是特殊的几何体&#xff0c;它的每个面都是由正方形组成的&#xff0c;那么如何把正方形展开&#xff0c;它的形状是什么样子的呢&#xff1f;展开的图形是唯一的吗&#xff1f;下面就一起来学习用数学绘图软件制作正方体展开动画…

最大正方形问题

最大正方形问题 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;最大正方形问题 CSDN&#xff1a;最大正方形问题 题目描述 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 题目链接见&am…

搞懂正方体展开图

正方体的对称性 观察一个正方体的6个面. 这6个面对于正方体来说是对称的, 这里的对称并非几何或视觉上的对称, 而是一种抽象的对称. 换句话说, 为了研究正方体面的性质, 我们可以任意选择一个面, 对于这个指定面的研究结果, 可以复制到其他5个面上. 因为在指定某一个面之前, 这…

RFM模型以及案例

一.RFM模型定义 百度百科定义:**RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中&#xff0c;RFM模型是被广泛提到的。该机械模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况.* *简…

数据分析——RFM模型

目录 一、RFM模型概述R值&#xff1a;最近一次消费&#xff08;Recency&#xff09;F值&#xff1a;消费频率&#xff08;Frequency&#xff09;M值&#xff1a;消费金额&#xff08;Monetary&#xff09; 二、基于RFM模型的实践应用1、基于RFM模型进行客户细分2、通过RFM模型评…

RFM模型与Spark实现

RFM模型与Spark实现 RMF模型什么是RMF模型给R、F、M按价值打分基于RFM模型的用户价值划分 代码实现 RMF模型 什么是RMF模型 R最近一次消费时间&#xff1a;R越小&#xff0c;客户价值越高F消费频率&#xff1a;F值会受到品类的影响&#xff0c;不适合做跨类目比较M消费金额&a…

RFM模型实战

什么是RFM模型 RFM模型是衡量客户价值和客户创利能力的重要工具。该模型通过一个客户的近期购买行为、购买的总体频率&#xff0c;以及花了多少钱三项指标来描述该客户的价值状况。 如何构建RFM模型 最近一次消费 (Recency) 最近一次消费意指上一次购买的时间——用户上一次…

RFM模型总结

RFM模型 1. 什么是RFM模型&#xff1f;2. RFM有什么作用&#xff1f;3. 怎么构建RFM模型 1. 什么是RFM模型&#xff1f; RFM名词解释 R&#xff1a;最近一次消费&#xff08;recency&#xff09; 代表用户距离当前最后一次消费的时间 反向值 R越大 用户价值越低F&#xff1a;消…

tableau-RFM模型

解释 R-最近一次消费&#xff08;Recency&#xff09;&#xff0c;通常影响因素为店铺的记忆强度&#xff0c;接触机会的多少&#xff0c;回购周期等。这个指标会用于决定客户接触策略&#xff0c;接触频次&#xff0c;刺激力度等。 F-消费频率&#xff08;Frequency&#xf…

【笔记】电商RFM模型

一、理论基础 &#xff08;1&#xff09;RFM模型 R&#xff1a;Recency 最近一次购买–付款日期-按照买家昵称 groupby 取付款日期的信息 F&#xff1a;Frequency 购买频次-付款日期-按照买家昵称 groupby 取付款曰期次数 M&#xff1a;Monetary 购买金额-实付金额-按照买家…

RFM模型分析

1.RFM的重要意义 RFM模型是衡量用户价值和用户创利能力的重要工具和手段 通过用户的近期交易行为、交易频次以及交易金额三个指标描述客户价值 指标解释意义 R(Recency) 用户最近一次交易的时间间隔R值越大&#xff0c;表示越久没有发生交易 F(Frequency) 用户在最近一段…

RFM 模型

RFM 模型 顾客价值分析 顾客价值分析 由于激烈的市场竞争&#xff0c;各个公司相继推出了多样灵活的优惠方式来吸引更多的客户。 对一个没有购买力的顾客&#xff0c;你打电话推销优惠活动毫无作用&#xff0c;可一个高价值顾客&#xff0c;会说有优惠活动怎么不通知我呢&…

数据分析八大模型:详解RFM模型

大家好&#xff0c;我是爱学习的小xiong熊妹。 今天跟大家分享的是一个经常被提及&#xff0c;但是价值被严重低估的模型&#xff1a;RFM模型。 一、RFM的基本思路 RFM模型由三个基础指标组成&#xff1a; R&#xff1a;最近一次消费至今的时间 F&#xff1a;一定时间内重复…

线性代数:如何求特征值和特征向量?

一、特征值和特征向量的定义 1 首先让我们来了解一下特征值和特征向量的定义&#xff0c;如下&#xff1a; 2 特征子空间基本定义&#xff0c;如下&#xff1a; END 二、特征多项式 1 特征多项式的定义&#xff0c;如下&#xff1a; 2 推论&#xff1a;n阶方阵A可逆的充…

如何用计算机求特征值特征向量,利用QR算法求解矩阵的特征值和特征向量

利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了好久 1.我要求特征值和特征向量. 2.找到一种算法QR分解矩阵求解特征值 3.QR矩…