当前位置: 首页 > news >正文

MFC综合实验二学习记录

文章目录

    • 虚函数和纯虚函数的区别?
    • 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填充

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

在这里插入图片描述

相关文章:

MFC综合实验二学习记录

文章目录 虚函数和纯虚函数的区别&#xff1f;MFC中什么是UPDATE_COMMAND_UI 消息如何查看控件对应的成员变量模态对话框的理解HGDIOBJ" 类型的值不能用于初始化 "CBrush *" 类型的实体错误MFC编程中CDC类型和HDC类型有什么区别&#xff1f;关于WIDING和ALTERNA…...

Python 中的运算符介绍(1)

算数运算符 常见的% 、//、/ 用法 赋值运算符 赋值运算&#xff1a;将等号右边赋值给等号左边 常见场景&#xff1a; 比较运算符 代码解析&#xff1a; 逻辑运算符 位运算符&#xff08;了解&#xff09; 三目运算符 身份证运算符 成员运算符...

达梦数据库查询各表数据量/以及达梦更新统计信息

1、达梦数据库查询各表数据量 达梦数据库与开源的MySQL不一样&#xff0c;MySQL查询各表数据量非常简单 而达梦数据库就有一些地方要注意&#xff0c;先用这句去查↓ SELECT table_name, num_rows FROM all_tables WHERE tablespace_name 表空间名; 如果结果如下图一样&…...

Java---- 静态内部类与非静态内部类的区别

在面试中回答的很不全&#xff0c;所以再此做一个总结。 1 static 静态修饰符 在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的。 static修饰表示静态的&#xff0c;在类加载时JVM会把它放到方法区&#xff0c;被本类以及本类中所有实例所公用。在编译后所分…...

STM32 基础知识(探索者开发板)--135讲 ADC转换

ADC定义&#xff1a; ADC即模拟数字转换器&#xff0c;英文详称 Analog-to-digital converter&#xff0c;可以将外部的模拟信号转换 ADC数模转换中一些常用函数&#xff1a; 1. HAL_ADC_Init 函数 HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc); 初始化ADC 形参&…...

Java经典框架之SpringBoot

SpringBoot Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. SpringBoot基础 2. Spring…...

LeetCode75| 二叉搜索树

目录 700 二叉搜索树中的搜索 迭代 递归 450 删除二叉搜索树中的节点 700 二叉搜索树中的搜索 注意二叉搜索树的性质即可 迭代 class Solution { public:TreeNode* searchBST(TreeNode* root, int val) {while(root ! NULL){if(root->val < val)root root->r…...

博物馆3d虚拟场景复原制作有助于传承和弘扬中华民族优秀传统文化

古建筑3D虚拟复原是一种利用现代科技手段对古代建筑进行数字化保护和展示的方法。它通过高精度的三维扫描技术&#xff0c;将古建筑的形态、结构、材料等信息转化为数字化数据&#xff0c;再通过计算机图形学技术将这些数据重建为虚拟的三维模型。这种技术在古建筑保护、研究、…...

二维码地址门牌系统:便捷报修服务引领社区新篇章

文章目录 前言一、二维码门牌系统介绍二、便捷报修服务三、多功能应用四、技术发展与应用前景 前言 科技的快速发展引领了社区生活的新变革&#xff0c;其中二维码门牌系统技术在社区管理方面带来了极大的便利和智能化服务。本文将深入了解这项创新技术及其优势。 一、二维码门…...

c++基础(对c的扩展)

文章目录 命令空间引用基本本质引用作为参数引用的使用场景 内联函数引出基本概念 函数补充默认参数函数重载c中函数重载定义条件函数重载的原理 命令空间 定义 namespace是单独的作用域 两者不会相互干涉 namespace 名字 { //变量 函数 等等 }eg namespace nameA {int num;v…...

RS485数据采集模块,如何一次采集多个modbus设备数据?

在工业数据采集中&#xff0c;RS485是一种常见的数据通信协议&#xff0c;而Modbus则是其上的常用设备协议。那么&#xff0c;如何用一个模块高效采集多个Modbus设备的数据呢&#xff1f;这就是我们今天要探讨的话题&#xff01; 什么是RS485数据采集模块&#xff1f; 首先&a…...

面试 Vue 框架八股文十问十答第一期

面试 Vue 框架八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;MVVM 的理解 MVVM (Mod…...

【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队

一、前言 性能测试之于软件系统&#xff0c;是保障其业务承载能力及稳定性的关键措施。以软件系统的能力建设为主线&#xff0c;系统能力设计工作与性能测试工作&#xff0c;既有先后之顺序&#xff0c;亦有相互之影响。以上&#xff0c;在性能测试的场景决策&#xff0c;架构…...

建立分位制,用标准去量化优化效果 - 启动优化为例

Android开发的四年多时间中&#xff0c;逐渐将自己的工作重心从业务移动到小型项目的架构设计&#xff0c;在此过程中代码的书写有了更高的标准和要求&#xff0c;性能优化从此伴随着工作脚步&#xff0c; 为什么要进行性能优化呢&#xff1f; 页面访问时长从1s增加到3s&#…...

Modbus 通信协议 二

Modbus 常用缩写 通用Modbus帧结构 -应用数据单元&#xff08;ADU&#xff09; Modbus数据模型 Modbus ADU 和 PDU 的长度 Modbus PDU结构 串行链路上的 Modbus 帧结构 Modbus 地址规则 ASCLL 模式 和 RTU 模式的比较 RTU 模式 RTU 模式位序列 帧格式 帧的标识与鉴别 CRC 循环冗…...

关于系统设计的一些思考

0.前言 当我们站在系统设计的起点&#xff0c;面对一个新的需求&#xff0c;我们该如何开始呢&#xff1f;这是许多处于系统分析与设计领域的新手常常思考的问题。有些人可能会误以为&#xff0c;只要掌握了诸如面向对象、统一建模语言、设计模式、微服务、Serverless、Servic…...

Java 第19章 IO流 课堂练习+本章作业

文章目录 Buffered流拷贝二进制文件创建文件写入文本读取文本文件存读Properties文件 Buffered流拷贝二进制文件 package com.hspedu.chapter19.outputStream;import java.io.*;public class BufferedCopy02 {public static void main(String[] args) {String srcFilePath &q…...

一键制作电子样册,提升企业品牌形象

​电子样册作为一种新型的宣传方式&#xff0c;具有许多优势。首先&#xff0c;它打破了传统纸质宣传册的局限性&#xff0c;可以随时随地展示企业的产品和服务。其次&#xff0c;电子样册可以通过多媒体形式展示企业的品牌形象&#xff0c;包括图片、视频、文字等多种形式&…...

Linux 的引导与服务控制

一 开机启动过程 bios加电自检-->mbr-->grub-->加载内核文件-->启动进程 1 bios家电自检 检测硬件是否正常&#xff0c;然后根据bios中的启动项设置&#xff0c;去找内核文件 2 mbr 因为grup太大,第一个扇区存不下所有的grub程序&#xff0c;所以分为2部分指…...

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测

多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测 目录 多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入…...

高端电流检测方案

随着过去传统的“开环”系统被智能和高效率“闭环”设计所取代&#xff0c;准确的电流检测在多种应用中变得越来越重要。常见的电流检测方法&#xff0c;需要将检流电阻串联进被测电流通路&#xff0c;再用放大电路放大检流电阻上的压降。这个放大电路常被称之为电流检测放大器…...

IP地址、子网掩码与网络地址

一、IP地址 在 TCP/IP 体系中&#xff0c;IP 地址是一个最基本的概念。IP地址的作用&#xff1a;实现和网上的其他设备进行通信 IP地址的表示方法 互联网上的每台主机&#xff08;或路由器&#xff09;的每个接口都分配一个全世界唯一的IP地址。该IP地址由ICANN分配。 IP地址…...

python 深度学习 记录遇到的报错问题10

本篇继python 深度学习 解决遇到的报错问题9_module d2l.torch has no attribute train_ch3-CSDN博客 一、CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stackt…...

linux下docker搭建Prometheus +SNMP Exporter +Grafana进行核心路由器交换机监控

一、安装 Docker 和 Docker Compose https://docs.docker.com/get-docker/ # 安装 Docker sudo apt-get update sudo apt-get install -y docker.io# 安装 Docker Compose sudo apt-get install -y docker-compose二、创建配置文件及测试平台是否正常 1、选个文件夹作为自建…...

Github 2023-12-31 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-31统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量TypeScript项目3Swift项目1Java项目1HTML项目1Astro项目1Python项目1C项目1Dart项目1Jupyter Notebook项目1C项…...

管程-第三十三天

目录 为什么要引入管程 管程的定义和基本特征 用管程解决生产者消费者问题 结论 本节思维导图 为什么要引入管程 原因&#xff1a;在解决进程的同步与互斥问题时&#xff0c;信号量机制存在编写困难和易出错的问题 能不能设计一种机制&#xff0c;让程序员写程序时不再需…...

嵌入式中断理解

一、概念 中断&#xff1a; 在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行。 中断优先级&#x…...

React16源码: Hooks源码实现

Hooks 1 &#xff09;概述 Hooks 在 React16.7版本出现的新功能Hooks 改变了整体应用开发的模式&#xff0c;同时开发体验会和以前会变得不一样Hooks 让函数组件具有类组件的能力 在 function component 里面没有this无法保存 state通过 Hooks可以让 function component 代替…...

华为端口隔离高级用法经典案例

最终效果&#xff1a; pc4不能ping通pc5&#xff0c;pc5能ping通pc4 pc1不能和pc2、pc3通&#xff0c;但pc2和pc3能互通 vlan batch 2 interface Vlanif1 ip address 10.0.0.254 255.255.255.0 interface Vlanif2 ip address 192.168.2.1 255.255.255.0 interface MEth0/0/1 i…...

java项目启动jar包启动参数设置端口号

默认启动 java -jar myapp.jar 指定配置文件 java -jar myapp.jar --spring.profiles.activedev 指定端口号 java -jar myapp.jar --server.port8080 后台启动 nohup java -jar myapp.jar --server.port8080 >outlog.log 2>&1 &...

疫情防控政策/苏州seo排名优化课程

一.模块的搜索路径 模块的加载路径&#xff1a;内存》内置模块》sys.path(系统内置的环境变量,一系列自定义的模块) import sys print(sys.path) #查询系统的环境变量,以列表的形式进行存储 # 默认第一个元素就是当前被执行的文件目录# 我们可以自定义的去加入系统的配置 sys.p…...

wordpress post grid/上海搜索seo

一、前言&#xff1a;mysql8之后想比起之前常用的版本改动还是挺大的&#xff0c;因为刚从安装接触&#xff0c;就先从基本的说起。现在的mysql8安装只能采用解压配置版&#xff0c;像以前老版本的傻瓜式安装将不复存在。其实mysql8了解如何安装之后也不是特别麻烦&#xff0c;…...

做wish如何利用数据网站/免费seo技术教程

NASA新项目&#xff1a;安卓手机变卫星 | 36氪. Android与物联网的联系正在进一步加深 前几天看到数码相机装Android系统... 利用智能手机的众多特性&#xff0c;真的可能实现无所不能呀&#xff01; 就像上一篇文章说的&#xff0c;连听筒都可以被充分利用&#xff01;转载于:…...

大鹏网站建设公司/网页制作平台有哪些

1). 在面向对象的方法中&#xff0c;一个对象请求另一个对象为其服务的方式是通过发送A.调用语句B.命令C.口令D.消息正确答案&#xff1a;D2). 下列的( )原始类型在使用流时可以互换。A.byte和booleanB.char和intC.byte和charD.String和char正确答案&#xff1a;B答案解析&…...

学校网站开发/网址和网站的区别

误解一&#xff1a;数据仓库和数据湖二者在架构上只能二选一 很多人认为数据仓库和数据湖在架构上只能二选一&#xff0c;其实这种理解是错误的。数据湖和数据仓库并不是对立关系&#xff0c;相反它们的并存可以互补给企业架构带来更多的好处&#xff1a; 数据仓库存储结构化的…...

wordpress baidu插件/做企业网站建设的公司

作者&#xff1a;闻币知天下 BitPay是世界上最受欢迎的比特币支付处理公司之一&#xff0c;因难以忍受BCE高额的交易成本&#xff0c;去年年底&#xff0c;BitPay在自己的支付平台和借记卡中添加比特币现金&#xff08;BCH&#xff09;支持&#xff0c;这标志着该平台支持更多加…...