Windows精解:窗口类释疑

从上一篇我转载如何进行Windows SDK编程开始,我希望可以借此补充一下Windows编程的一些背景知识。之所以这样,是因为在我前面介绍“SW系统的窗口类”时,假设了读者对Windows界面编程已经有一定的了解。

上一篇主要从介绍“如何用”的角度阐述Windows编程。但是我个人习惯“打破沙锅问到底”,很多东西是靠“悟”,而不是“记”。所以这一篇我们聊聊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资源的生命周期负责。换句话说,窗口只拥有菜单/图标句柄。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
### 回答1: 《Verilog HDL实用精解》是一本设计人员必备的指南书籍。Verilog HDL是硬件描述语言的一种,它是用于设计数字系统的。本书主要针对初学者和中级设计人员,包括了Verilog HDL的基础知识和设计技术,帮助读者快速掌握该语言。 本书可以帮助读者进行系统级设计,可以应用于各种数字电路的设计,如嵌入式系统、通信控制、计算机处理器等。该书内容涵盖了从基础的Verilog HDL知识到高级设计技术,包括组合逻辑电路、时序电路、存储器和存储器控制器、数字信号处理等方面的内容。 读者可以通过本书了解到如何进行仿真和验证,在设计过程中避免一些常见的错误,提高设计的可靠性。此外,本书还提供了大量的实际案例,帮助读者利用所学知识设计出高性能、低功耗、高可靠性的数字系统。 总之,《Verilog HDL实用精解》是一本全面、易懂、实用的设计指南。读者可以透过该书学习到设计数字系统的基础知识和设计技术,快速提高自己的设计水平,成为一名优秀的设计高手。 ### 回答2: 《Verilog HDL实用精解PDF》是一本非常优秀的电路设计书籍,对于想要成为设计高手的人来说,是一本非常宝贵的资料。Verilog HDL是一种高级硬件描述语言,它可以用于数字电路开发,故而在电路设计中应用广泛。 这本书的内容非常详细,对于不同层次的读者来说都非常有帮助。对初级读者来说,本书提供了对Verilog HDL的简单解释,包括语言元素,语法规则和应用场景等内容。对于有经验的读者来说,本书更是提供了实用的技术示例和项目实战经验,让读者能够快速地掌握设计技能。 此外,本书还提供了许多实例,这些实例既包括了简单的电路,也包括了复杂的设计,能让读者更好地理解设计思路,从而提高自己的设计能力。 总体来说,《Verilog HDL实用精解PDF》是一本非常好的电路设计书籍,读完后可以帮助你掌握Verilog HDL的基础知识,从而使你成为一个更强大的设计高手。 ### 回答3: Verilog HDL (Hardware Description Language) 是一种常用于硬件描述的编程语言。《Verilog HDL实用精解》是一本关于Verilog HDL应用的书籍,通过实用的案例和实践,帮助读者掌握Verilog HDL的使用技巧。 该书分为四部分,分别是基础篇、综合篇、布局篇和实践篇。基础篇主要介绍Verilog HDL的基础语法和基本概念,包括模块、端口、信号、赋值、条件语句、循环语句等。综合篇主要介绍了如何将Verilog HDL代码综合到门级电路,包括时序逻辑、组合逻辑、状态机设计、FPGA 等。 布局篇主要介绍Verilog HDL的物理实现和布局布线的技术,包括布局优化、时序优化、功耗优化、时钟树设计等。实践篇则通过一些实际案例,让读者深入了解Verilog HDL代码的设计和实现过程。 通过阅读《Verilog HDL实用精解》,读者可以全面了解Verilog HDL的应用,熟练掌握硬件设计的技能,轻松成为设计高手。该书内容丰富、实用性强,能够满足读者不同阶段和程度的学习需求。同时,该书也是一本值得硬件设计爱好者和从业人员一起阅读和交流的书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值