MFC综合实验二学习记录

news2024/10/6 6:43:45

文章目录

    • 虚函数和纯虚函数的区别?
    • MFC中什么是UPDATE_COMMAND_UI 消息
    • 如何查看控件对应的成员变量
    • 模态对话框的理解
    • HGDIOBJ" 类型的值不能用于初始化 "CBrush *" 类型的实体错误
    • MFC编程中CDC类型和HDC类型有什么区别?
    • 关于WIDING和ALTERNATE填充方式的问题

这是MFC中CdcdrawView函数中的消息映射宏,我的问题是如何找到ID_SET对应的是什么菜单项资源


在这里插入图片描述


最后的解决方案比较简单,只需要使用 Ctrl + F,然后输入 ID_SET 来搜索,注意到要调整搜索范围为当前项目,就可以找到对应的文件了!


在这里插入图片描述
在这里插入图片描述


注意要点击查找全部,可以看到搜索到的结果完美的符合要求, ID_SET是设置菜单项对应的ID。


在这里插入图片描述


虚函数和纯虚函数的区别?

虚函数(Virtual Function)

定义:虚函数是在基类中使用关键字 virtual 声明的函数。它可以在派生类中被重写(Override)。

实现:虚函数在基类中通常有具体的实现。这意味着即使派生类没有重写这个函数,也可以使用基类中的实现。

目的:虚函数的主要目的是允许在派生类中对基类方法进行扩展或修改,同时使用基类指针或引用来实现多态。

示例

class Base {
public:
    virtual void display() {
        std::cout << "Display of Base" << std::endl;
    }
};

多态:通过基类指针或引用调用虚函数时,会根据对象的实际类型来调用相应的函数实现,实现多态。

纯虚函数(Pure Virtual Function)

定义:纯虚函数是在基类中使用 virtual 关键字声明的,但没有提供任何实现,并以 = 0 结尾。例如,virtual void display() = 0;

实现:纯虚函数在基类中没有实现,派生类必须重写这个函数,除非派生类也是抽象类。

目的:纯虚函数的主要目的是定义一个接口,强制派生类实现特定的函数。这是创建抽象基类(即不能直接实例化的类)的一种方式。

示例

class Base {
public:
    virtual void display() = 0; // 纯虚函数
};

抽象类:包含至少一个纯虚函数的类称为抽象类。不能创建抽象类的实例。这是因为抽象类定义了一个尚未完全实现的接口。

总结

虚函数允许在基类中有一个默认实现,而派生类可以选择是否提供新的实现。

纯虚函数不在基类中提供实现,强制派生类提供自己的实现。包含纯虚函数的类成为抽象类,无法实例化。


MFC中什么是UPDATE_COMMAND_UI 消息


在这里插入图片描述

在 MFC (Microsoft Foundation Classes) 应用程序中,UPDATE_COMMAND_UI 消息是一种用于实时更新用户界面元素状态的机制。它不是由用户直接操作触发的,而是由框架在特定时刻自动发送,用于查询命令(如菜单项、工具栏按钮等)的当前状态。这允许程序动态地调整用户界面元素,以反映当前的应用程序逻辑和数据状态。

作用
UPDATE_COMMAND_UI 消息的主要作用是维护用户界面的一致性和正确性。例如,根据当前文档的状态,一个菜单项可能需要被启用或禁用,或者一个工具栏按钮可能需要显示为被选中或未选中状态。

如何工作
当 MFC 应用程序的主消息循环运行时,框架会定期发送 UPDATE_COMMAND_UI 消息给所有的用户界面元素(如菜单项和工具栏按钮)。接收到这个消息的用户界面元素需要决定自己的显示状态。这通常涉及以下几个方面:

是否启用:元素是否可用或灰显(禁用)。
是否选中:例如,切换按钮的选中/未选中状态。
其他视觉状态:如文本标签的变更等。

示例
假设您的应用程序有一个 “保存” 菜单项,您希望在文档被修改后启用它,在文档未修改时禁用它。您可以添加一个处理 UPDATE_COMMAND_UI 消息的函数来实现这一点:

void CMyApp::OnUpdateFileSave(CCmdUI* pCmdUI)
{
    // 检查文档是否已修改
    bool isModified = /* 获取文档状态 */;
    
    // 根据文档的修改状态启用或禁用 "保存" 菜单项
    pCmdUI->Enable(isModified);
}

在这个例子中,每当用户界面需要更新时(例如,当用户编辑文档时),这个函数会根据文档的当前修改状态来启用或禁用 “保存” 菜单项。



如何查看控件对应的成员变量


打开类向导中的对话框类对,可以看到成员变量和对应的控件ID。


在这里插入图片描述

模态对话框的理解

HGDIOBJ" 类型的值不能用于初始化 “CBrush *” 类型的实体错误

在CGraph类的绘制函数中,在选中画笔画刷的过程中出现了一点小问题,错误是

严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E0144 “HGDIOBJ” 类型的值不能用于初始化 “CBrush *” 类型的实体 dcdraw E:\LearningMaterial\大四上\OO报告\综合实验二\202000800341_XXX_综合2_1\CGraph.cpp 448

	//选中画笔画刷
	CPen* pOldpen=pDC->SelectObject(&bpen);
	if (bfill) { //填充
		CBrush* pOldBrush=pDC->SelectObject(&br);
	}
	else{
		CBrush* pOldBrush= pDC->SelectObject(GetStockObject(NULL_BRUSH));
	}

可以看到上下两行的画刷选中代码几乎一致,为什么会出现这样的问题呢?

在 MFC 中,CDC::SelectObject 方法期望一个与设备上下文相关的对象(例如 CBrushCPen 等),但是 GetStockObject 函数返回的是一个 HGDIOBJ一个更通用的GDI对象句柄)。HGDIOBJ 是 Windows API 中的一个术语,是 “Handle to a GDI Object” 的缩写。

因此,从 HGDIOBJ 转换到 CBrush* 需要显式的类型转换,而不是隐式的。修改成如下的形式,即没有问题。

//选中画笔画刷
	CPen* pOldpen=pDC->SelectObject(&bpen);
	if (bfill) { //填充
		CBrush* pOldBrush=pDC->SelectObject(&br);
	}
	else{
		CBrush* pOldBrush= (CBrush*)pDC->SelectObject(GetStockObject(NULL_BRUSH));
	}

MFC编程中CDC类型和HDC类型有什么区别?

在Windows编程中,CDC 和 HDC 是两种不同的,但相关的概念,它们都用于图形绘制,但在不同层面上提供功能:

  1. HDC (Handle to Device Context):
  • HDC 是一个指向设备上下文的句柄。在Windows API(特别是在底层的C或C++编程中)中使用。
  • 它是一个低层次的图形绘制接口,提供了直接访问GDI(图形设备接口)的功能。
  • HDC 可以用于屏幕、内存位图、打印机等多种绘图表面。
  • 使用 HDC 通常涉及直接的Windows API调用,例如 MoveToEx, LineTo, TextOut, Ellipse 等。
  1. CDC (Class for Device Context):
  • CDC 是MFC(Microsoft Foundation Classes)框架中的一个类,它封装了 HDC。
  • 它是一个更高层次的、面向对象的接口,使得在使用MFC编写的C++程序中绘图变得更简单和更直观。
  • CDC 提供了更多的安全性和易用性,因为它自动管理资源,如选择和取消选择GDI对象(例如画笔、字体)。
  • CDC 类包含了多个用于绘图的成员函数,这些函数实际上是对 HDC 函数的封装。例如,CDC::LineTo 是 LineTo 的封装。

简而言之,HDC 是一个更接近于Windows底层的、基于句柄的设备上下文表示,而 CDC 是MFC框架中的一个类,它提供了一个更高级别和更面向对象的接口来处理设备上下文。在MFC程序中,通常使用 CDC 而不是直接操作 HDC,因为它简化了代码并提高了安全性。但在底层的WinAPI编程中,HDC 是必不可少的。


关于WIDING和ALTERNATE填充方式的问题

这个问题其实并不重要,但是没想到随便一搜迟迟难以找到答案,给我精神造成了极大的打击,务必要记录下来。

  1. ALTERANATE:从左到右水平扫描!系统只填充每个扫描行的多边行的奇数边到偶数边的部分,不填充偶数边到奇数边的部分;
    在这里插入图片描述

MSDN中的原话如下:

When the fill mode is ALTERNATE, GDI fills the area between odd-numbered and even-numbered polygon sides on each scan line. That is, GDI fills the area between the first and second side, between the third and fourth side, and so on.

水平扫描

就是显示器上的从左到右一行一行的水平扫描,假如你客户区大小是 500 × 600 500\times600 500×600,那就是从 ( 0 , 0 ) (0,0) (0,0) ( 500 , 0 ) (500,0) (500,0) 这是第一次水平扫描,…一直到 ( 0 , 600 ) (0,600) (0,600) ( 500 , 600 ) (500,600) (500,600)。共扫描了600次就扫描完了客户

奇数边和偶数边

这里说的奇数和偶数边完全是相对而言的啊,只是我们便于理解的一种方法,就是说在水平扫描一行时,第一次遇到对线就把它定义为第一条边(注意:同一条线的话在不同的扫描行上相对的边可能不是一样的,这点一定要注意思了),第二次遇到的线就是第二条边,以此类推;那么对于一个矩形( 就单单一个矩形),左是第一条边,右是第二条边,上下它就什么都不是了,不会存在第三条边和第四条边的.

  1. WINDING模式下:填充奇数边到偶数边和ALTERANATE模式一样,但填充偶数边到奇数边的部分就不同了,你必须记主画线的方向,你可以取一个方向为正向,用一个计数器 cnt = 0,当线经过正向时cnt就加1,反向时cnt就减1,如果最后cnt为0就填充这个区域,不为0就不填充!

MSDN中的原话如下:

When the fill mode is WINDING, GDI fills any region that has a nonzero winding value. This value is defined as the number of times a pen used to draw the polygon would go around the region. The direction of each edge of the polygon is important.

在这里插入图片描述
这是WIDING模式下的填充结果,可以看到存在奇数边到偶数边问题的只有4和5。

  • 我们首先观察4,根据从区域4得到的射线,设定正方向为顺时针,经过的第一条边-1,第二条边+1, cnt = 0,所以区域4不填充
  • 接着从区域5观察,设定正方向为顺时针,经过的第一条边+1,第二条边+1,所以区域5填充

一种简单的理解方式是看能不能环绕成功,能环绕成功则可以填充,下图五角星是一笔画绘制的,可以自己思考一下

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深挖小白必会指针笔试题<一>

目录 引言 关键解决办法&#xff1a; 学会画图确定指向关系 例题一&#xff1a; 画图分析&#xff1a; 例题二&#xff1a; 画图分析&#xff1a; 例题三&#xff1a; 注&#xff1a;%x是按十六进制打印 画图分析&#xff1a; 例题四&#xff1a; 画图分析&…

常见的算法交易类型,一文看懂个人如何开通算法交易程序?

算法交易是指由计算机系统根据证券的历史数据分析、实时市场行情和交易员选择的策略及参数等&#xff0c;利用计算机程序和数学模型来决定交易下单的时机、价格和数量等&#xff0c;通过将大单拆为小单&#xff0c;以减小市场冲击成本&#xff0c;提高交易效率和交易隐蔽性的智…

裂变新模式:分销市场的翘楚

在当今的商业世界&#xff0c;推荐机制已经成为一种重要的营销策略。通过用户推荐&#xff0c;企业不仅能够扩大品牌影响力&#xff0c;还能有效降低获客成本。然而&#xff0c;如何设计一个合理的推荐机制&#xff0c;使得用户有足够的动力去推荐新人&#xff0c;同时保持团队…

1分钟生成爆款风景视频,Stable Video Diffusion最简教程

AI视频是2024年的重头戏&#xff0c;各大AI厂商都在跑视频技术&#xff0c;快速推出更牛的黑科技&#xff0c;SD其实在11月底就出了一款官方视频大模型-SVD&#xff0c;来跟runway、pika抢这块大蛋糕。 之前生成的视频效果还不是很理想&#xff0c;远没runway效果好&#xff0c…

Leetcod面试经典150题刷题记录 —— 链表篇

Leetcod面试经典150题刷题记录-系列Leetcod面试经典150题刷题记录——数组 / 字符串篇Leetcod面试经典150题刷题记录 —— 双指针篇Leetcod面试经典150题刷题记录 —— 矩阵篇Leetcod面试经典150题刷题记录 —— 滑动窗口篇Leetcod面试经典150题刷题记录 —— 哈希表篇Leetcod面…

数据库选择题 (期末复习)

数据库第一章 概论简答题 数据库第二章 关系数据库简答题 数据库第三章 SQL简答题 数据库第四第五章 安全性和完整性简答题 数据库第七章 数据库设计简答题 数据库第九章 查询处理和优化简答题 数据库第十第十一章 恢复和并发简答题 2015期末 1、在数据库中&#xff0c;下列说…

红酒送礼选对不选贵,这些挑选技巧一定要收藏好

遇到过节的时候&#xff0c;大家都张罗着买点什么东西送给亲朋好友老丈人&#xff0c;领导同事丈母娘。云仓酒庄的品牌雷盛红酒LEESON分享选择最多的就是烟酒茶&#xff0c;烟和茶已经成为常态&#xff0c;送红酒却是一种新风尚。在琳琅满目的红酒品类中&#xff0c;怎么才能选…

羊大师讲解喝羊奶的好处,让女性坚持下去!

羊大师讲解喝羊奶的好处&#xff0c;让女性坚持下去&#xff01; 羊奶是一种富含营养价值的健康饮品&#xff0c;且被广泛认为对女性有诸多好处。喝羊奶不仅能够提供丰富的营养物质&#xff0c;还含有一些特殊的成分&#xff0c;对女性健康起到了积极的作用。那么&#xff0c;…

RTC第二个功能和应用程序

一般RTC模块设备管理时间日历、计时器等。从年到二。一些爱普生RTC 模块可以通过使用来自32768 Hz的分割频率来管理次第二功能。本文件 描述了RTC模块的三个具体的应用程序。&#xff08;表1&#xff09; 表1中的功能和产品 [FOUT函数应用程序] 图1描述了RTC模块&#xff0…

Codeforces Good Bye 2023 A~E

A.2023(思维) 题意&#xff1a; 有一个序列 A a 1 , a 2 , . . . , a n k A a_1, a_2, ..., a_{n k} Aa1​,a2​,...,ank​&#xff0c;且这个序列满足 ∏ i 1 n k a i 2023 \prod\limits_{i 1}^{n k}a_i 2023 i1∏nk​ai​2023&#xff0c;而这个序列中的 k k k个…

零售业一个逆天新模式,背后这个技术太厉害!

新零售模式是指通过整合先进的科技手段和数字化技术&#xff0c;重新定义传统零售业务模式&#xff0c;以提高效率、降低成本&#xff0c;并为消费者提供更便捷、个性化的购物体验。 自动售货机作为新零售模式的一部分&#xff0c;通过智能化、自动化的方式&#xff0c;为消费者…

sentinel控制面板dashboard的下载安装教程

目录 一、dashboard控制面板下载二、启动dashboard 一、dashboard控制面板下载 资源下载地址: https://github.com/alibaba/Sentinel/releases 也可以点击这里进行下载&#xff0c;无需积分 找到需要下载的版本&#xff0c;展开下面的资源Assets&#xff0c;下载sentinel-das…

鸿蒙HarmonyOS- 弹框组件库

简介 今天介绍一个基于ArkUI框架开发的弹框组件库&#xff0c;该库基于ArkUI的弹框基础功能和自定义能力。针对通用的弹框业务场景&#xff0c;该库提供了丰富的组件弹窗功能。 包括确认输入弹窗、列表展示选择弹窗、自定义底部/顶部弹窗、自定义动画弹窗、自定义全屏弹窗、消息…

SpringBoot—支付—支付宝

一、流程 二、沙箱操作 1.用支付宝账号登录【开放控制平台】创建应用获取 appid 2.选择沙箱模拟环境 3.沙箱应用-》获取appid(一个appid绑定一个收款支付宝账户) 4.利用开发助手工具生成RSA2密钥 公钥&#xff1a;传给支付宝平台 私钥&#xff1a;配置代码中&#xff0c;…

【每日一题】2487. 从链表中移除节点-2024.1.3

题目&#xff1a; 2487. 从链表中移除节点 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8] 输出&#xff1a;[13,8] 解释&#xff1a;需要移除的节点是 5 &…

计算机网络期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

DataGear 4.7.0 发布,数据可视化分析平台

DataGear 4.7.0 发布&#xff0c;严重漏洞和BUG修复&#xff0c;具体更新内容如下&#xff1a; 新增&#xff1a;HTTP数据集新增【编码请求地址】支持&#xff0c;可用于解决请求地址中文乱码问题&#xff1b;新增&#xff1a;新增数据源密码加密存储支持&#xff08;开启需设…

企业CIO如何面对数字化转型

随着互联网新技术的不断发展&#xff0c;必将导致商业模式的改变&#xff0c;企业信息化的内涵也将发生改变。IT在企业的定位更可能会上升到合作伙伴型与引领型这些较高的层面&#xff0c;IT架构模式、系统建设模式、IT部门结构等都将发生质变。而数字化时代必定属于CIO的时代&…

Vue3.4更新 “Slam Dunk“发布!!!

Announcing Vue 3.4 | The Vue Point. vue3.4更新官方文档 在vue2即将结束更新的时候&#xff0c;vue3迎来了一个重要的更新。代号为“&#x1f3c0; Slam Dunk”&#xff0c;即"灌篮高手"。这个版本进行了很多显著的内部改进&#xff0c;最重要的是模版解析的底层逻…

访问学者J1签证的申请流程

访问学者J1签证是许多人前往美国进行学术研究和文化交流的重要途径之一。申请J1签证需要经过一系列步骤和程序&#xff0c;让知识人网小编带大家来了解一下申请流程吧。 首先&#xff0c;申请者需要确认自己符合J1签证的资格要求。这包括被美国的赞助机构或组织接受&#xff0c…