什么是所谓的Windows子类化

面向对象大家都清楚。现在OO的主流是基于类的面向对象。子类化故名思义就是定义一个子类,也就是要订制一个类变成一个新类的意思。
不过Windows的子类化不是如此。
首先,我们知道,除了基于类的面向对象以外,还有基于原型(或者叫基于对象)的面向对象。Windows是一个基于对象的OS,它的对象系统更倾向于基于原型的OO。Windows开发的一个核心概念是Window,也就是常说的窗口,所有的一切别的东西都是围绕着这个展开的。一个Windows应用程序,其基本的逻辑框架就是:创建一个窗口,接收系统发给该窗口的消息进行处理。收到结束消息的时候,关掉窗口,程序完蛋。
Window(注意,不是 Windows)相关的一个概念叫作WindowClass,窗口类。窗口类是个啥东西?呵呵,窗口类也是一个对象,具体的可以认为是Window的原型。创建一个WindowClass对象,可以基于该窗口类对象创造多个Window,这些Window在某一方面都是一致的。举个例子,有一个窗口类叫做Button,以这个Button为原型创建的所有Window在某一方面都是一样的。哪一方面呢?某些样式,消息处理例程,菜单等等等等。这些都是 WindowClass里面规定的东西。
那位说了,哦,知道了,基于窗口类原型创建出来Window,这个过程就是子类化。呵呵,广义上说,这是对的,就是特化了一些东西。但Windows子类化有个特殊的含义,它是特指某种行为的。
WindowClass作为一个对象,拥有对象的一切特征,其中包括修改其状态(或属性)的能力。WindowClass有一个属性叫做消息处理器,其实是一个函数指针,指向一个处理发送给它的实例(也就是那些以它为原型的Window)的消息的函数。
所谓的子类化,就是替换这个函数指针成员,用一个新的消息处理函数替代原来的消息处理函数。你或许会觉得奇怪,为什么这个动作叫做子类化?仔细想想其实也不奇怪,不就是修改了WindowClass的行为了么,这个就是子类化了:)
现在我们可以深入的分析一下这个消息处理函数的特征了。
它的职责是处理OS分发给它的各种消息,所以他的典型结构如下:
Handle
{
switch (msg.name)
{
case msgA:
processMsgA(msg.params);
break;
...
default:
windowsSystemDefaultProcess(msg);
break;
}
}
对于所有感兴趣的消息,都可以加一个分支处理。于是很多人开始不满了,觉得有坏气味,要重构。重构的方式是把消息和处理做成一个map,这样消息处理就变成:
Handle
{
if (map[msg.name])
{
map[msg.name](msg.params);
return;
}
return windowsSystemDefaultProcess(msg);
}
剩下的问题就是怎么充填这个消息到处理的映射了。
这个充填的方式,MFC采用了宏(其实大多数C++框架都采用了宏),但是宏并不让人满意。采用宏也是历史原因导致的,那时候C++并没有STL这么好用的容器库。有了map,我们再采用宏的方式生成一个映射数组的方式已经过时了。
有了这一步的重构,我们就可以一个函数针对一个消息进行处理了,CWnd就帮我们干了这样一件事。我们要是相对某个特定的消息进行特定的处理,可以给它一个特定的处理函数,放在map中替换原来的处理函数即可。还有另一种方式就是override从CWnd继承下来的消息处理的虚函数,使用C++的动态分派能力进行特定化。
Windows C/C++编程窗口子类化学习 也许你需要一个特殊的Edit来限制浮点数的输入,但是现有的Edit却并不能完成这项工作,因为它只能够单纯的限制大小写或者纯数字。当你在论坛上求救的时候,某个网友告诉你:“用子类化。” 子类化 在Windows中,每一个窗体都会有一个HWND;Windows提供了一个API,GetWindowLong,通过这个函数得到HWND的原始消息处理过程函数的指针,将其保存起来,再调用SetWindowLong来设置一个新的函数指针,使这个指针指向我们自己的函数,这样,在我们的消息处理函数中,只处理我们关心的消息,不 阅读详情

相关推荐

深度学习初探 - 入门 DL 主流框架

这个课程主要是引导大家入门TensorFlow、Theano、Keras 及 Caffe 几个主流的深度学习框架。在课程中有关各种算法的详细推导及思想我们不会做过多的陈诉,旨在通过让同学们动手操作搭建自己的神经网络模型,了解如何使用这些框架解决实际问题。课程会基于每个框架的官方文档,先带大家熟悉框架中基本的定义语法及常用函数(可看成深度模型的小零件),每个实验最后都会综合这些零件搭建一个简易的神经深度网络模型。这个项目十分适合具有一定python编程基础,对人工智能、深度学习感兴趣的同学。Theano。

2401_86435672的博客 1235

解说Win32的窗口子类化

也许你需要一个特殊的Edit来限制浮点数的输入,但是现有的Edit却并不能完成这项工作——因为它只能够单纯的限制大小写或者纯数字。当你在论坛上求救的时候,某个网友告诉你:“用子类化。”你也许会在看到一线曙光的同时多出了一连串的问题:何为子类化?子类化的原理是什么?如何实现子类化?下面就让我从一个简单的C++程序开始,一步步解开你的疑团吧。  首先,我为你列出以下这个C++程序:#include

清清湖水 1127

【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)

【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)

challenglistic的博客 5万+

窗口子类化(SubClassing) SetWindowLong

一、什么是子类化(Subclass) 视窗系统是基于消息驱动的。因此每一个窗口都有一个函数来处理这些消息,系统管理的窗口结构中有一域记录着这个函数的地址(使用GetWindowLong函数传入索引标识GWL_WNDPROC可获取此值)。所有系统发送到这个窗口的消息都会交由此函数来处理。所以改变窗口结构中这个指针值到自定义的某个函数(使用SetWindowLong函数带GWL_WN

靠别人不如靠自已。 5575

从零到一:基于STM8的125KHz RFID读卡器实现与曼彻斯特码解析实战

本文详细介绍了基于STM8单片机的125KHz RFID读卡器实现过程,重点解析了曼彻斯特码的编码原理与解码算法。通过硬件电路设计、软件实现及性能优化,帮助开发者低成本构建稳定读取EM4100卡片的系统,适用于门禁、考勤等应用场景。

weixin_42525211的博客 236

DLMS/COSEM协议的理解体会

DLMS是通信协议,COSEM是电表建模规范。HDLC帧基本格式为0x7e......

一个bug是bug,多个bug能work 8314

超类化(Superclass)和子类化(Subclass)

窗口化(windowing)实现形式有超类化(Superclass)和子类化(Subclass),下面一探究竟···子类化 Subclass子类化是在窗口实例创建之后,把其窗口过程设置为另一个用户定义窗口类的窗口过程函数,从而改变窗口行为。定义用户定义窗口即窗口子类化函数的调用者定义为子类窗口,而窗口实例所对应的窗口类为超类窗口。下面分析这一过程。template BOOL C

Wendysuly的专栏 3091

Cost-effective Attention Reuse across Multi-turn Conversations in Large Language Model Serving

通过多回合对话与人类互动是大型语言模型(LLM)的一个基本特征。然而,由于需要重复计算历史token的密钥值(KV)缓存,用于执行多回合会话的现有LLM服务引擎效率低下,从而导致高服务成本。为了解决这个问题,本文提出了AttentionStore,这是一种新的注意力机制,可以在多回合对话中重用KV缓存(即注意力重用),显著降低重复计算开销。AttentionStore维护一个分层的KV缓存系统,该系统利用经济高效的内存/存储介质为所有请求保存KV缓存。

c_cpp_csharp的专栏 394

眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

眼见为实(2):介绍Windows的窗口、消息、子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词。为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程。子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法。不要把“子类化、超类化”与面向对象语言中的派生类、基类混淆起来。“...

技术代码资料库 406

EndNote X9 参考文献附录列表 格式调整

EndNote X9 插入参考文献常见问题总结

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2570

Python爬虫实战:基于Scrapy与Playwright高效爬取人民网新闻数据

本文将详细介绍如何使用Python最新技术栈(Scrapy框架结合Playwright浏览器自动化工具)高效爬取人民网新闻数据。文章包含完整项目搭建、反反爬策略、数据解析存储以及性能优化等核心内容,提供可直接运行的代码示例,适合中高级Python开发者学习现代网络爬虫开发技术。python# 去除特殊空白字符。

2201_76125261的博客 1120

详细介绍Windows中的子类化

​​定义​​子类化是指​​继承现有窗口类(如按钮、编辑框)并重写其消息处理逻辑​​的过程。通过替换默认的窗口过程函数WNDPROC),开发者可以截获控件的消息流,插入自定义处理逻辑,同时保留原始功能。​​消息传递流程​​​​默认流程​​:系统控件(如按钮)的窗口消息由系统预定义的窗口过程处理。​​子类化后​​:消息先传递到自定义的窗口过程,开发者可在此修改消息或调用原始窗口过程(继续默认处理。​​关键函数​(替换窗口过程)、CallWindowProc(调用原始处理函数)。

felicity_one的博客 933

C# WPF上位机实战:从零开发空压机监控系统(含实时监控+故障预警+数据追溯)

在工业生产场景中,空压机作为核心动力设备,常面临这些痛点:压力/温度异常导致停机、油耗超标未及时发现、设备故障追溯无数据支撑、人工巡检效率低且易遗漏。而基于C# WPF开发的空压机监控系统,能通过实时采集设备运行参数、智能分析运行状态、联动故障预警,实现“状态监控-异常告警-数据追溯-远程管控”全流程自动化,完美解决传统管理模式的弊端。今天就带大家落地这套空压机监控系统,基于C# + .NET 8 + WPF + Modbus TCP/RTU协议,整合压力、温度、油耗、运行时长等核心参数监控,搭配WPF的数

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1104

Delphi中通过子类化实现全局WINDOWS事件处理

var  oldWndProc: Pointer = nil;  SubclassHandles : TList;  SubclassWndProc: TList;procedure SaveInstance(instance: Pointer);type  Parser = packed record     funcPtr: Pointer;     objPtr: Pointer;  end

铜板的专栏 1853

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

windows编程32-窗口子类化

FairLikeSnow的博客 233

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

介绍Windows的窗口、消息、子类化和超类化

介绍Windows的窗口、消息、子类化和超类化这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词。为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程。子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法。不要把“子类化、超类化”与面向对象语言中的派生类、基类混淆起来。“子类化、超类

静 1005

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

windows api窗口子类化,CallWindowProc,DefWindowProc的区别

(如注册窗口类时):用。

982

Windows GUI 窗体的子类化和超类化

窗体子类化的作用:窗口子类化技术最大的特点就是能够截获windows的消息。一旦用户自定义的窗口函数截取了传向原窗口函数的消息,就可以对被截取的消息进行如下处理: 将其传给原窗口函数。这是对大多数消息应该采取的措施,因为子类通常只对原来的窗口特性做少量的改动。 截取该消息,阻

logens的专栏 1698

用窗口子类化技术改进Windows编辑框控件的功能

用窗口子类化技术改进Windows编辑框控件的功能  1.问题的提出   尽管Windows系统提供了丰富的通用控件(如按钮,编辑框,滑动条等),但 仍不可能满足我们实际应用中千差万别的需求,笔者在某项目的开发工作中就遇见 了这样的问题。项目需要一个供用户输入表格数据的接口界面,要求只接收用户输 入的数据信息,并可以利用键盘上的光标键移动输入位置以避免用户在键盘和鼠标 之间的频繁切换。简单地

skyremember的专栏 1344

Windows的窗口、消息、子类化和超类化

米度软件:www.midosoft.cn   这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词。为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程。子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法。不要把“子类化、超类化”与面向对象语言中的派生类、基类混淆起来。“子类化、超类

米度软件的专栏 670

windows sdk 子类化

子类化的概念:劫持系统默认的窗口过程函数,对消息进行过滤处理,用自己的窗口过程函数替换系统提供的默认窗口处理函数 重设窗口过程函数API有两个 SetWindowLong:仅修改窗口实例属性 SetClassLong:修改窗口类的属性,只影响以后创建的窗口,之前存在的窗口不受影响 g_pfnOldEditWndProc = (WNDPROC)SetWindowLong(hEdt, GWL_...

qq_35426012的博客 241

Windows 窗口子类化和超类化

子类化(Subclass)是指替换窗口过程(WNDPROC) 超类(Superclass)是替换窗口过程(WNDPROC),并且替换ClassName。 Subclass不太像继承,而像一种外挂(HOOK)行为。 Superclass更像继承,因为生成了新的窗口类,并且继承了行为。 WinX中Subclass和Superclass用同一个类实现,都是 WinX::Subcl

小龙王2010 1471

Windows核心编程_窗口子类化

窗口子类化:窗口子类化,即重定向消息,也就是修改某个窗口消息执行函数,重定向下面代码可以让你更好的理解窗口子类化:先介绍三个函数:1.GetWindowLong函数原型:LongGetWindowLong(HWNDhWnd,intnlndex);参数介绍:HWNDhWnd:目标窗口句柄intnlndex:要获取的窗口类型信息:宏定义常量描述GWL_EXSTYLE-20获取扩展窗口样式GW...

17岁boy的博客 2454
上一篇: 集合和类型系统
下一篇: 关于x86系列CPU的段
lifeNet
博客等级 码龄20年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值