Windows精解:窗口类释疑

win32-注册窗口类、创建窗口 阅读详情

by  许式伟

这一篇我们聊聊Windows SDK为何会是如今这个样子的。

 

 

对于一个经典的WinMain函数,通常包含三步:

  1. 注册窗口类(RegisterClass)。
  2. 创建并显示窗口(CreateWindow and ShowWindow)。
  3. 消息循环(MessageLoop)。即:取得消息 -> 分派消息 -> 处理消息。

窗口程序需要“创建并显示窗口”,这显而易见。关于“消息循环”也容易理解,并且我们在“SW系统简介”中描述已经得非常详细。

我相信最令人迷惑的是:“窗口类”是什么概念?为什么需要RegisterClass?

有人回答:“窗口类”是同类窗口的公共属性,是这一类窗口的共享数据。
有人回答:“窗口类”是同类窗口的默认数据(属性)。

回答窗口类数据是共享数据的,错误。因为我们知道每一个窗口都有自己独立的菜单、图标、窗口过程(WindowProc,这个最重要了)等等。它们并不存在共享关系。回答是默认数据(属性)的,正确,但没有回答为什么需要默认属性,更没涉及到更为重要的原因。

我们先来看看CreateWindow与CreateDialog的原型:

HWND CreateWindow(
    LPCTSTR lpClassName,
    LPCTSTR lpWindowName,
    DWORD dwStyle,
    
int  x,
    
int  y,
    
int  nWidth,
    
int  nHeight,
    HWND hWndParent,
    HMENU hMenu,
    HINSTANCE hInstance,
    LPVOID lpParam
);

 

HWND CreateDialog(      
    HINSTANCE hInstance,
    LPCTSTR lpTemplate,
    HWND hWndParent,
    DLGPROC lpDialogFunc
);

为什么普通窗口(Window)的创建不是象对话框(Dialog)一样,直接把窗口过程(WindowProc)传进去,甚至把其他窗口类相关的数据全部直接在CreateWindow时传入?也许有人回答说,这是为了减少CreateWindow的参数个数。——呵呵,我还真不知道怎么去证明这种说法是错的。但是我固执的认为我下面给出的理由要充分些。

听说过序列化(Searialize)技术吗?有读者马上回答:知道,这是MFC中把对象写入磁盘和从磁盘中读入并还原出这些对象的技术。这个回答我给它4分(满分5分)。是的,序列化(Searialize)是对象持久化和还原的技术。但这不是MFC才开始有,而是DOS下Turbo Vision就已经有的一个技术。

对话框是什么?对话框其实是支持了序列化(Searialize)技术的特殊窗口,它在初始化的时候,从资源中还原(创建)出它的各个子窗口。只是,与普通序列化(Searialize)不太一样的是,对象持久化过程不是对话框做,而是对话框编辑器负责的。

无疑,基于对话框进行可视化编程是相当友好的。那么,从支持这种可视化编程的角度来看,我们需要支持序列化(Searialize),需要从磁盘中创建窗口。我们再回头看看CreateWindow函数的原型,你将发现,这些参数是“可序列化(可存盘)”的。而且,你立刻意识到,窗口过程(WindowProc)是不可序列化的。

我们知道,序列化技术需要RuntimeClass技术进行对象的动态创建。而所谓的RuntimeClass技术,无非是建立了类唯一标识(如类名、GUID等)到类创建函数(其他的附属数据是比较次要的)的映射而已。

现在到了关键:为了支持从磁盘还原窗口对象,Windows需要引入窗口类名,并建立它与窗口过程(WindowProc)的映射。——这正是RegisterClass存在的意义。而RegisterClass中其他的窗口类属性是次要的,并且也许前面说得没错,这些属性的存在,只是为了减少CreateWindow函数的参数个数。

补充:点击这里了解RuntimeClass与Searialize的实现机理。

补充:“绅士亦花心”提到了GDI资源的共享问题。应当承认,我前面说“窗口类数据是共享数据”这种说法错误,是比较武断的说法。是的,Windows必须面对GDI资源的共享问题,不同窗口亦存在资源共享的事实。更为合理的说法是:每一个窗口可以独立设置自己的菜单、图标、窗口过程,但菜单/图标等GDI资源是可以共享的。因为我们知道,Windows对GDI资源的共享策略是,窗口不拥有GDI资源(菜单/图标等)的所有权,用户必须为GDI资源的生命周期负责。换句话说,窗口只拥有菜单/图标句柄。

RT-Thread新手必看:FMT飞控移植中的5个常见坑及解决方案 本文针对RT-Thread新手在移植FMT开源飞控时遇到的5大核心挑战,提供了深度解决方案。内容涵盖SCons构建系统配置、RT-Thread版本API兼容性处理、BSP与设备驱动适配、TOML系统配置解析以及算法模块集成调试,帮助开发者高效避坑,成功完成飞控移植。 阅读详情

相关推荐

Ansys Lumerical 启动时出现 Error: Could not connect to Ansys license server specified at 1055@ 的一种解决办法

考虑到 2020 版的时候是直接在全局变量里指定具体地址,但是 2024 版本是写成 1055@localhost ,并且之后在站里搜相关 Ansys 的问题都指向 1055 端口被占用,虽然问题不一样,但是本着死马当活马医,就按照。我最近在跑超透镜结构,听说2024版本现在有GPU加速可以用,就把Lumerical从2020升到2024版本,结果发现一开头的破解办法完全不一样了。一开始安装的时候以为2020没有删干净,导致2024版的安装一直锁着目标地址,解决办法参考。的办法来操作,在关闭了。

qq_51404184的博客 5762

CreateWindow创建对话框

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34006468的博客 1143

SPSS(二)SPSS实现多因素方差分析模型(图文教程+数据集)

SPSS(二)SPSS实现多因素方差分析模型 单因素方差分析上一篇博客https://blog.youkuaiyun.com/LuYi_WeiLin/article/details/89917656已经介绍完毕 这篇博客我们主要来学习多因素方差分析 多因素方差分析,就是同时考虑若干个控制因素的情况下,分别分析它们的改变是否造成观察变量的显著变动 (多个自变量,一个因变量)自变量类型以分类变量为主也可以...

可乐联盟 6万+

一千个是什么 - Windows窗口、控件和对话框

 Windows应用程序是通过窗口(Window)、控件(Control)和对话框(Dialog Box)来和用户交互的,Windows系统预定义了很多基本的交互行为和外观,也预定义了很多共用的控件和对话框,让应用程序开发者更容易开发出一致的、标准的交互界面,降低最终用户的学习曲线,并提高用户体验。MFC(Microsoft Foundation Classes)是对Windows

the Art thinks 2827

【Android】汽车电源管理:深入解析CarPowerManager与Suspend To RAM的交互机制

本文深入解析了Android Automotive OS中CarPowerManager与Suspend To RAM(深度睡眠)的交互机制。详细阐述了从车辆发出睡眠请求,到CarPowerManagementService协调应用状态,最终通过内核进入低功耗睡眠的完整流程,并探讨了唤醒机制、开发者实践及功耗优化策略,为车机应用开发与系统优化提供关键指导。

weixin_28339967的博客 292

Camera tuning flow相机调试流程

相机调试流程分为三大模块:ProcessRaw处理原始数据(黑电平校正、阴影校正),3A实现自动控制(曝光/对焦/白平衡),ISP进行图像精加工(伽马校正、锐化降噪、色彩处理)。三个阶段环环相扣,前阶段为后阶段提供基础,最终输出画质优良且风格化的图像。

weixin_64706696的博客 1230

[学习笔记] Windows编程——窗口和消息 ——(二)窗口类

每个窗口类都有一个由所有该窗口类对象所共享的窗口程序来处理该类的所有窗口实例的消息,以控制其行为和外观。进程必须先注册窗口类,然后才能创建该类的窗口。注册窗口类会将窗口程序、类样式和其他类属性与类名因此类名是比较重要的,是 Key,创建窗口类对象时都是使用类名字符串来查找窗口类)相关联。

cxsydzn的博客 1414

FPGA以太网开发实战:YT8511 PHY芯片MDIO接口配置全流程(附Verilog代码)

本文详细介绍了FPGA以太网开发中YT8511 PHY芯片MDIO接口的配置全流程,包括MDIO接口技术解析、Verilog状态机设计、核心代码实现细节及实战调试经验。通过提供经过验证的Verilog代码和优化策略,帮助开发者快速掌握以太网PHY芯片配置技术,提升通信系统性能。

weixin_29184371的博客 233

Windows 程序设计:创建第一个窗口

超详细的Windows窗口创建教程!只要你有C语言基础就能轻松学会!文章末尾附带完整的Windows窗口创建代码!

先写一个BUG吧 1万+

一文读懂 SAP BTP Application Router 的 Resource Files:从 xs-app.json 到本地开发的默认设置

本文详解SAP BTP中Application Router的资源文件配置与本地开发实践。核心包括:xs-app.json定义路由规则与安全策略,package.json声明依赖与启动脚本,resources/存放静态资源,default-services.json和local-destinations.json用于本地模拟云服务。文章通过真实案例展示如何配置静态资源直出、反向代理后端服务,并强调本地开发时的注意事项与常见问题解决路径。关键配置均提供示例代码,帮助开发者快速实现业务应用的部署与联调。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 180

MacBook M芯片第二篇:Homebrew安装

Homebrew是MacOS/Linux平台的软件包管理工具,提供便捷的安装、卸载、更新等功能。

码农魏轩 895

C++Windows编程之注册窗口类

我们用Visual Studio创建一个win32项目上会自动生成一个注册窗口类。如下: // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex

4514

Archery通过OpenResty代理转发后登录一直提示Forbidden

测试几遍,连账号密码都没用验证,因为不管输什么都是提示Forbidden。找到配置文件settings.py,下面命令可到配置文件路径。回到页面刷新,随便输入个账号密码,验证失败证明请求成功了。查看Preview,提示CSRF验证失败,请求被中断。域名:dba.hkeasyspeed.com。打开开发者工具查看,网络里面可以看到报403。添加一条配置,把你配置域名添加进去。可以看到页面可以正常访问到。进入Archery容器。重启Archery容器。正常输入账号密码,OK。

万物皆可学 3148

windows第六章 MFC窗口类

m_hWnd:指示附加到此CWnd的HWND。是public属性的成员str.Format(L"当前窗口句柄:%#X",m_hWnd);

yerennuo的博客 970

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Windows编程】windows窗口创建过程详解

搞windows开发,必须熟悉vs自己的开发工具,这会提高你的开发效率;我用的是vs2013;感觉不错;

呋喃吖的博客 6484

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Windows窗口程序之新建窗口(C++)

Windows窗口程序之新建窗口 创建Windows的流程

Rohly的博客 6393

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Windows精解:超类与子类

超类与子类(Superclass & Subclass)Q: 我看了WINX开发包中的文档中,你提到了超类,它是什么概念?我平常只听过子类(Subclass)。A: 子类化(Subclass)是指替换窗口过程(WNDPROC)。    超类(Superclass)是替换窗口过程(WNDPROC),并且替换ClassName。   Subclass不太象继承,而像是一种外挂(Hook)行为。

QBox/Golang/CERL/StdExt/TPL/WinxGui - 许式伟的专栏 5392

注册窗口类 registerclass

window把窗口以不同的类别进行设计,通过不同的类别来管理不同的资源,体现模块化管理的思想。以mfc为例Button类别有ccheckbox,cbutton,radiobutton等 ,Static类别有cstatic、staticgroup等。 一个应用程序在创建某个类型的窗口前,必须首先注册该“窗口类”(Windows Class)。注意,这里不是C++类的类。Register Wind...

u011555996的博客 3814

windows应用程序开发系列五:注册窗口类

开发流程: 1 定义一个窗口处理函数 2 注册窗口类 3 创建窗口 4 显示窗口 5 更新窗口 6 消息循环 窗口类的分类     -系统窗口类      系统已经定义好的窗口类,所有应用程序都可以直接使用。     -应用程序全局窗口类       由用户自己定义,当前应用程序所有模块都可以使用。     -应用程序局部窗口类       由用户自己定义,当前应用程序中

wangping623的专栏 1333
上一篇: 如何快速入门Windows编程
下一篇: 应用程序框架设计(3):RuntimeClass与序列化
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值