IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> MFC底层探索:如果关联的控件变量类型与注册窗口类名称不匹配的行为会如何 -> 正文阅读

[C++知识库]MFC底层探索:如果关联的控件变量类型与注册窗口类名称不匹配的行为会如何

我们知道windows系统会预先为我们注册一些窗口类 如"button",“edit”,"Static"等等;而在MFC中如果我们关联控件变量的时候,关联的类类型与对应关联的窗口的注册窗口类名称如果不匹配会发生什么;拿CStatic与CEdit这俩个MFC为我们写好的类举例
首先我们看看这二个MFC如何封装这二个类的;【这里就不暂时这二个类的源码了】从MFC源码上我们可以看出这二个类本身并没有添加任何新的数据成员,全部都是继承CWnd类;但是里面提供的接口不同,看实现我们发现这些成员函数的实现全部都是发消息给对应的窗口;
这些消息肯定要被窗口过程处理,所以我们先看看系统定义了哪些消息 https://docs.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues#system-defined-messages

从源码我们可以得知,MFC定义的类之所以能够起作用是因为向窗口发送了消息并获得响应(返回值);那么我们看向窗口发送与其注册窗口类不匹配的这些系统预定义的消息会如何就知道关联控件如果与窗口类不匹配会如何;我们以这个消息为例EM_GETLINECOUNT

设定条件断点追踪这个消息的处理;我们发现至少在EM_GETLINECOUNT这个消息上无论是向匹配的m_linkedit发送还是向不匹配的m_static发送最后都会走到DefWindowProc里面去;但是匹配的DefWindowProc调用返回结果可以返回正确的值;而不匹配的调用DefWindowProc返回的是0;【或许对不同的消息DefWindowProc的差异行为可能会不同,甚至消息路由不一定都是走DefWindowProc;但是这都对我们想说明的问题而言无关紧要】
那么从这个消息的追踪我们就可以看出;如果不匹配的会有怎么样的行为:
1.首先就是这些自定义或者MFC定义的成员函数可能没有作用了,因为这些函数的实现是向一个窗口发送不匹配的消息;可能被DefWindowProc忽略默认处理了;既然这样就那么这些自定义或者MFC定义的类就毫无意义因为在面向对象设计上的初衷就是继承接口;而现在这些接口无法发挥作用!
【这里有人会说如果先不考虑面向对象设计,完全不用类类型原来提供的接口,并且尽可能的添加自己的消息响应函数避免走默认的DefWindowProc函数处理是不是就可以了;】【还是太天真】
2.自定义或者MFC定义的类类型的消息响应函数可能永远不会被响应;因为他们关联的那个注册窗口类的窗口可能永远不会发生需要响应的那个消息!
3.与第二条相对的是无法响应注册窗口类对应的窗口本来可以响应的消息,即便是手工在不匹配的自定义类中去添加这个消息的响应函数也无法得到响应【MFC实测】

所以你认为如果抛开面向对象接口的设计,只要不使用原来提供的接口,并且自己提供消息处理函数就万事大吉是愚蠢的干法;

Effective MFC :不要发生关联类类型与窗口注册类的不匹配的行为!

测试源码:

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:05:39  更:2022-04-09 18:05:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:41:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码