MFC原理与方法(二)

2023-10-26

一、前言

时间过得好快啊,又是一个星期过去了!我又回来啦!每个星期保持写博客的习惯,及时消化上课的知识,不仅仅对我有帮助和意义,如果可以帮助到其他人那就更好了,意义就更加大了!好了,话不多说,接下来我继续给大家带来MFC原理与方法!Let’s go!
在这里插入图片描述


二、类向导的使用

类向导是一个很好的工具,我们可以通过类向导来快速添加生成消息处理函数。但是,你可能会在第一次使用类向导的时候会报错。错误如下。
在这里插入图片描述
这是因为文件的缺失导致的,只需要把C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin目录下的RcDll.Dll文件复制到C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\bin目录下就行了。
使用类向导的操作如下:
在这里插入图片描述


三、MFC消息管理

MFC消息管理主要包括消息发送和消息处理两个过程。对于消息发送,MFC提供了类似于API函数功能的消息发生函数。MFC消息处理的内部机制相对复杂,但用户可以不用向基于API编程那样去关心函数WndProc()。接下来,我们看看MFC是如何处理消息的。


(1).MFC消息映射机制

对于消息处理,MFC采用了消息映射机制。每个类都有一个消息映射,与该类有关的消息都出现在该类的消息映射中。类的消息映射把一组消息映射宏组成一个消息映射表,每项消息映射宏都将一个函数和一个特定的消息关联起来,在出现给定的消息时,将调用对应的函数。

在这里消息映射宏起到了一个桥梁的作用,它将特定的函数和特定的消息关联起来。我们先来看看一个消息映射表。

BEGIN_MESSAGE_MAP(CMFCView, CView)
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CMFCView::OnFilePrintPreview)
	ON_WM_CONTEXTMENU()
	ON_MESSAGE(UserMessage,UserFun())
END_MESSAGE_MAP()

宏BEGIN_MESSAGE_MAP()表示消息映射开始宏END_MESSAGE_MAP()表示消息映射结束。有很多种消息映射宏,不同的消息映射宏由于不同的消息。我们以常见的**ON_MESSAGE(UserMessage,UserFun())**为例,ON_MESSAGE()指示哪个函数将处理用户定义的消息,UserMessage代表的是消息ID,UserFun()是消息映射到的消息处理程序函数的名称。有关于其他的消息映射宏的解释,我就不多说了,大家可以点击右边链接进行查看。消息映射宏.

还有,消息处理函数必须在类的定义中声明,类向导会在函数前加上afx_msg标识。并且,消息映射必须在类的定义最后用宏DECLARE_MESSAGE_MAP()来表明该包含作为消息处理程序的成员函数

class CMFCView : public CView
{
	......		//中间省略部分代码
protected:
// 生成的消息映射函数	afx_msg void OnFilePrintPreview();
	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
	public:
	afx_msg void UserFun();
protected:
	DECLARE_MESSAGE_MAP()
};

(2).消息处理

我们定义一个函数之后就是编写代码来处理信息,这部分的话,我们就通过实践来讲吧,我们做一个窗口动态旋转显示。
首先利用MFC应用程序向导建立一个单文档应用程序,然后点击菜单“项目”->“类向导”选项,打开“类向导”对话框,为类····(你设置的项目名称)View添加两个消息处理函数:OnTimer()和OnLButtonDown()
添加OnLButtonDown()
在这里插入图片描述
添加OnTimer():
在这里插入图片描述
然后,我们需要在OnLButtonDown()函数里添加一个定时器SetTimer(),这个计时器的作用就是每个一段时间执行一件事,因为是动态旋转并且显示文字,所以需要一个定时器来设计(时间间隔,反复出现)。

void CMFCView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	SetTimer(1,100,NULL);		//第一个参数是计时器的ID,你可以随意设置;第二个参数是时间间隔,单位为毫秒;第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数。
	CView::OnLButtonDown(nFlags, point);
}

定时器定义好后,我们在定时器函数里写入窗口动态旋转显示的代码。

void CMFCView::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);		//用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,this指针一般指向本窗口或当前活动视图dc。
	m_dEscapement=(m_dEscapement+100)%3600;		//定义旋转角度,这里把360度分为3600度,按照比例,这里定义的是10度。
	CFont fontRotate;		//封装一个 Windows 图形设备接口 (GDI) 字体并提供用于操作字体的成员函数
	fontRotate.CreateFont(30,0,m_dEscapement,0,0,0,0,0,0,0,0,0,0,0);
	CFont *pOldFont=dc.SelectObject(&fontRotate);	//把一个对象(位图、画笔、画刷等)即fontRotate选入指定的设备描写叙述表
	CRect rClient;		//定义一个矩形区域,原本是有四个参数(x1,y1,x2,y2),这里默认为整个窗口区域。
	GetClientRect(rClient);		//用于取得指定窗口的客户区域大小,扩展一下:用于显示内容的区域叫客户区,非客户区用于显示命令按钮及窗口标题
	dc.FillSolidRect(rClient,RGB(255,255,255));//rClient为填充颜色的区域
	dc.TextOutW(rClient.right/2,rClient.bottom/2,L"欢迎大家学习MFC程序设计");
	dc.SelectObject(pOldFont);
	CView::OnTimer(nIDEvent);
}

FillSolidRect()函数中的RGB()函数接收三个 0-255 数值,一个代表红色,一个代表绿色,一个代表蓝色。例如RGB(0,255,0),红色和蓝色值都为 0,所以在该颜色中没有红色和蓝色。绿色为最大值 255。所以该颜色为绿色。(0,0,0) 为黑色(255,255,255) 为白色

关于函数CreateFont()说明(如果感觉参数太多,那就都设为0(默认)):
在这里插入图片描述
注意旋转角度m_dEscapement是需要在View类里提前定义的,不然会提示未知标识符而报错!
先在View.h文件里的View类里定义int m_dEscapement;
在这里插入图片描述
然后,在View.cpp文件里的View构造函数赋初值。
在这里插入图片描述
我们来看看效果如何:
在这里插入图片描述
大家还可以通过自己删除或者修改一些代码运行来理解每个代码所具有的含义,可以多试试,多实践实践。


四、结语

这次写博客的速度稍微慢了些,时间有点紧,主要是需要查找的资料有点多,整理起来有点费时间,但还是坚持下来了。累点没关系,这样还能锻炼锻炼自己的意志力,所以啊,做事不能半途而废,说不定咬咬牙再坚持一下就成功了呢?你说是吧。哎,说多了无用!还是得付出实践,继续努力提升自己吧,如果能够实现,哪怕再苦再累也是值得的一起加油吧!我相信我们还会再见面的!谢谢!


(声明一下:本人是大一新生,难免会出现错误,如果大家发现错误,请及时告诉我,我会及时更正,谢谢大家!)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC原理与方法(二) 的相关文章

  • IOCP AcceptEx 在连接时未创建完成

    我目前正在尝试一些用于套接字编程的新库 IOCP 我偶然发现了AcceptEx http msdn microsoft com en us library windows desktop ms737524 28v vs 85 29 aspx
  • PowerShell 中的 echo 和 Write-Host 有什么区别?

    我对之间的区别感到困惑echo and Write Host在 PowerShell 中 我有两个文件 POC ps1 validatePath ps1 这些文件位于我的本地计算机上 我使用以下命令在远程计算机上运行它们Invoke Com
  • Powershell添加系统变量

    我正在尝试使用 PowerShell 在此处添加系统变量 我已经尝试过两种方式使用 env MyTestVariable My test variable and Environment SetEnvironmentVariable Tes
  • windows下如何获取线程的起始地址?

    I m working on a mini windows process explorer in C I have a handle to a thread How can I retrieve starting address of t
  • Python - PIP 安装故障排除 - PermissionError: [WinError 5] 访问被拒绝

    使用 PIP 安装新软件包甚至将 pip 本身升级到最新版本时出现以下错误 我正在 Windows 8 1 机器上使用 Python 3 4 运行 pip 该消息告诉我我没有文件的管理权限 我的帐户是管理员帐户 我很感激任何关于如何解决这个
  • 查询具有相同ID的同一列中具有不同值的SQL表

    我有一个 SQL Server 2012 表ID First Name and Last name The ID每个人都是唯一的 但由于历史提要中的错误 不同的人被分配了相同的 ID ID FirstName LastName 1 ABC
  • 哪里可以下载 Microsoft.Phone.WinJS.2.1?

    我正在尝试使用 WinJS 制作通用 Windows 应用程序 我已经下载了VS2013的最新更新 RC 版本 我已经安装了我能找到的所有 SDK 我还安装了 WinLibJS VSE exe 扩展 有趣的是 VS 更新一直说我没有 当我打
  • 想了解 Windows 剪贴板内部结构

    我有兴趣学习 Windows 系统内部结构及其工作原理 我倾向于学习windows上的系统编程 在这种背景下 我很想知道有关 Windows 剪贴板内部功能的一些事情 当我们选择一些文本 图像等并按下时会发生什么 Ctrl C 当我们在不同
  • Windows 相当于 Mac OS X“打开”命令

    刘畅在这里问了一个与此非常相似的问题 Linux 相当于 Mac OS X 打开 命令 https stackoverflow com questions 264395 linux equivalent of the mac os x op
  • Java更改系统换行符

    在 Windows 上 使用System out println 打印出来 n r而在 Unix 系统上你会得到 n 有没有办法告诉java你想使用什么换行符 正如其他人已经说过的 系统属性line separator包含实际的行分隔符 奇
  • 如何保证清理代码在 Windows C++ 中运行(SIGINT、错误分配和关闭窗口)

    我有一个 Windows C 控制台程序 如果我不调用ReleaseDriver 在我的程序结束时 某些硬件会进入错误状态 并且在不重新启动的情况下无法再次使用 我想确定一下ReleaseDriver 即使程序异常退出 例如如果我点击Ctr
  • NodeJS 连接到 SQL Server getaddrinfo ENOTFOUNT

    我正在尝试使用 Knex js 连接到 Microsoft SQL Server 但收到 getaddrinfo ENOTFOUND 我知道这表明 NodeJS 无法解析地址 通常是通过 DNS 或协议问题 const knex requi
  • MFC CMenu 工具提示未显示

    我尝试使用类似的东西来设置 CMenu 项的工具提示 如所述here https stackoverflow com questions 2400180 mfc how to add tooltip in cmenu items 但它只是显
  • 如何“安装”自定义 Windows 驱动程序?

    我计划用 C 语言编写一个基本的 Windows 注册表过滤器 该过滤器的目的是挂钩所有 用户和内核特权 注册表调用 以便我可以在我的程序中使用它们 我基本上是复制 Mark Rusinovich 的 regmon 进程监视器 但更基本 我
  • 有没有办法查看 Docker for Windows 上的容器磁盘使用情况?

    我很好奇除了作为容器映像一部分的层之外 是否还有一种方法可以查看正在运行的 Windows 容器使用了多少磁盘空间 基本上 容器自创建以来 增长 了多少 在 Linux 或在 HyperV 中运行的 Linux 容器 中 这将是docker
  • 终止进程树(C for Windows)

    以前曾有人问过这个问题 但我在代码中找不到明确的答案 我打开一个进程 ProcessA PID 为 1234 此进程打开一个子进程 ProcessAB PID 5678 完成后 我终止了 ProcessA 但 ProcessAB 仍然存在
  • 没有名为“_pywrap_tensorflow_internal”的模块

    在尝试验证tensorflow gpu的安装时 在尝试执行 import tensorflow as tf 时出现ImportError 我在 Windows 7 上使用 Quadro K620 Tensorflow 是使用 pip 安装的
  • 如何检查程序是否在 Windows 上的 Ubuntu 上的 Bash 中运行,而不仅仅是普通的 Ubuntu?

    非常简单 确定您所使用的操作系统的通常位置似乎与 Ubuntu for Windows 上的普通 Ubuntu 相同 例如uname a与本机 GNU Linux 安装相同并且 etc os version与 Ubuntu Trusty T
  • Windows EventLog:它的操作速度有多快?

    我有一个服务应用程序 它通过 TCP 处理客户端请求并将任何事件写入 Windows EventLog 由于该应用程序预计会在短时间内为许多客户端和每个客户端的大量请求提供服务 假设每秒 1 到 50 个请求 因此我很想知道密集程度 CPU
  • Python执行windows cmd函数

    我知道你可以使用 subprocess 通过 Python 脚本运行 Linux 终端命令 subprocess call ls l for linux 但我找不到在 Windows 上做同样事情的方法 subprocess call di

随机推荐

  • hive 查询输入中文乱码

    设置 home 用户 profile 文件中LANG en US UTF 8即可
  • envi5.3处理高分二号影像数据详细过程记录

    目录 一 多光谱影像处理 1 辐射定标 2 大气校正 1 需要准备一些数据 2 大气校正过程 3 正射校正 二 全色影像处理 1 辐射定标 2 正射校正 三 图像融合 1 几何配准 2 图像融合 高分二号处理流程 envi5 3的安装教程
  • C3P0的详细配置说明(com.mchange.v2.c3p0.ComboPooledDataSource)

    C3P0是一个开放源代码的JDBC连接池 它在lib目录中与Hibernate一起发布 包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象 c3p0 config gt
  • 使用Pytorch进行多卡训练

    当一块GPU不够用时 我们就需要使用多卡进行并行训练 其中多卡并行可分为数据并行和模型并行 具体区别如下图所示 由于模型并行比较少用 这里只对数据并行进行记录 对于pytorch 有两种方式可以进行数据并行 数据并行 DataParalle
  • 数据库课程设计:图书信息管理系统(Java+MySQL)(附程序)

    期末数据库课程设计做了个图书信息管理系统 由于老师给的选题给得早 所以我在开学后的几周就开学搞了 删删改改整了好多 在此整理分享一下 项目简介 随着社会的发展 人们对知识的需求也在不断增长 书籍作为人们获取并增长知识的只要途径 使得书城 书
  • 如何通过远程桌面重启计算机?

    使用远程桌面连接远程计算机后 在开始菜单中只有 注销 和 关机 选项 无法直接重启现场终端 可以使用命令行重启现场终端 使用运行命令 Windows R键 输入命令行shutdown r t 0 Shutdown r t 5 关闭 重启 延
  • 看尚电视adb安装当贝桌面,并开机自启

    1 链接 可以电脑下奇兔刷机 实用工具里有adb 点开直接用 ADB 链接好后输入命令验证 c adb gt adb devices 如显示 192 168 5555 device字样表示链接成功 不同的adb前面几个字母也许不一样 2 开
  • 每个初级程序员都希望有一天能成为一名高级开发工程师。

    当程序员想要转向更高需求以及更高层次的角色时 他们的能力也必须随之提升 但也正因如此 很多人都会在这种转变中失败 程序员们通常认为 成为一名高级开发工程师必定要积累一定年限的经验以及十分擅长编程 虽然这些的确是必要因素 但想要成为一名高级开
  • 多线程创建的方式

    多线程的创建方式有以下几种 1 继承Thread类创建多线程 继承java lang Thread类 重写Thread类的run 方法 在run 方法中实现运行在线程上的代码 调用start 方法开启线程 Thread 类本质上是实现了 R
  • 【Ubuntu换源教程】不同Ubuntu系统版本换清华源

    今天在新电脑上装了虚拟机VMware Workstation Pro 16 在虚拟机上安装了Ubuntu20 04系统 在做Ubuntu20 04系统换源的时候 发现源要和Ubuntu的版本匹配 之前一直不知道 一直都是盲目换源 版本如果不
  • unity给localRotation赋值

    transform localPosition和transform localScale都是直接赋值三元数 给旋转赋值需要用 方法一 xxx transform localEulerAngles new Vector3 0 0f 0 0f
  • JS面试中常见的算法题

    1 验证一个数是否是素数 1 如果这个数是 2 或 3 一定是素数 2 如果是偶数 一定不是素数 3 如果这个数不能被3至它的平方根中的任一数整除 num必定是素数 而且除数可以每次递增 排除偶数 function isPrime num
  • 优秀logo设计解析_优秀Logo设计!具象表现手法!

    文 王新华 具象标志以客观物象的自然形态为造型基础 经过提炼 概括 抓住客观对象的精神内涵 强化其主要特征 忽略与舍弃次要因素 达到直观 感性的视觉效果 人物形 人是万物之灵 是社会的主宰 以人物为题材是标志设计的重要表现内容 人体的各种动
  • C++中memset函数详解

    memset函数定义于
  • Django中分页功能的实现及封装与调用(超详细)

    在django开发过程中 实现前端页面的分页是一个基本且常用的功能 下面就同小编一起完成分页功能的实现及封装与调用 一 在pycharm中创建django项目 小编默认看客朋友们都会创建 故不在赘述 若不熟悉 猛戳这里 二 在mysql中创
  • React事件处理、事件的特点、事件语法、React事件处理函数里的this、事件对象、阻止浏览器的默认行为

    React事件的特点 1 React 事件绑定属性的命名采用驼峰式写法 而不是小写 如 onClick 2 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数 而不是一个字符串 DOM 元素的写法 函数不写小圆括号 3 在 Reac
  • CSAPP malloclab实验

    书本配套实验地址 构造一个分配器是一件富有挑战的任务 设计空间很大 有多种块格式 空闲链表格式 以及放置 分割和合并策略可供选择 另一个挑战就是我们经常被迫在类型系统的安全和熟悉的限定之外编程 依赖于容易出错的指针强制类型转换和指针运算 这
  • FreeRTOS记录(五、FreeRTOS任务通知)

    在前面几篇文章我们已经对FreeRTOS任务API和任务调度原理进行了相对深入的分析 这篇文章主要针对任务与任务之间的交互 信息传递相关的API组件进行分析 目录 一 任务通知基本介绍 1 FreeRTOS 任务通知函数 2 CMSIS封装
  • Android调用打印机

    打印机其实和Android没有什么大的关系 和linux内核关联才是比较强的 最终的结果是要在Android实现驱动打印机 但是一般调试一个新的驱动的流程是这样的 1 先在linux PC上进行测试 2 在标准嵌入式linux上进行调试 3
  • MFC原理与方法(二)

    MFC原理与方法 二 一 前言 二 类向导的使用 三 MFC消息管理 1 MFC消息映射机制 2 消息处理 四 结语 一 前言 时间过得好快啊 又是一个星期过去了 我又回来啦 每个星期保持写博客的习惯 及时消化上课的知识 不仅仅对我有帮助和