窗口过程封装的一些实现

原创 2011年06月13日 04:03:00

 

-----------------------------------------------------------------------------------------------------------------
作者:  colin<linzhenqun@gmail.com>
微博:  http://weibo.com/jaccicagaga
-----------------------------------------------------------------------------------------------------------------
如何封装窗口过程是所有UI库最核心的设计之一,像MFC/WTL/VCL都各有自己的实现代码,最终的目标却是一样的:将窗口过程转化为对象的方法,从而把面向过程的Windows转化为面向对象的方式。这里要介绍我自己想到两种实现方式,这些实现都很简单,但都可以达到同样的目的。

一、利用窗口的属性表

基本原理是将窗口句柄和窗口类实例绑定在一起,每个窗口都有自己的属性表,通过GetProp和SetProp等API操作之,属性表本质上就是哈希表,通过一个Key快速查找到Value,在这里Key就是窗口句柄,Value就是窗口类。
另外,我们需要一个自己的标准窗口过程,用来找到与句柄关联的窗口类,然后再调用窗口类的窗口过程。
先看看实现的代码:
 
 
WndHandler提代SubClass和UnsubClass两个方法对窗口进行子类化和反子类化。
SubClass大概做法是先取到原来的窗口过程,然后调用自己的窗口过程(StdWndProc),最后通过SetProp将WndHandler的实例塞进窗口的属性表中。UnsubClass则是将原来的窗口过程恢复过去,同时通过RemoveProp将类实例从属性表中删除。
当子类化成功后,窗口过程变成了StdWndProc,在这里通过GetProp找到WndHandler实例,再调用它的WndProc方法,这样就完成了从窗口过程向对象方法的转换。
 

二、利用哈希表

上面的实现有一些缺点,一个是属性表的名字固定,如果这个窗口刚好有这个属性名,则会把这个属性给冲掉;另一个缺点是这字符串方式的,其中必然会有将字符串计算成哈希值的过程,这对效率有微小的影响。
其实我们完全可以用自己的哈希表来表现关联,下面是另一个实现的代码:
 
 
WndHandler.cpp:
 
 
注意上面的hash_map会因VS的版本不同而不同,这里用的是VS2003;代码与第一个版本基本一致,只不过将属性表转换为哈希表了。

 

相关文章推荐

跟我一起学Windows界面封装(四) 之 窗口过程函数(下) -- 奇妙的Thunk技术

本文是笔者参考多方资料,同时研究ATL源码后写的一些心得,因为在看源码时会出现很多点不懂,因此文章主要从这些小点出发而撰写,可能外人看来会有些语无伦次或者不够流畅,请见谅,不是计算机科班出身,才疏学浅...

Win32消息机制(窗口实现过程)

Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法。顺序的,过程驱动的程序有...
  • zmq5411
  • zmq5411
  • 2011年09月07日 20:30
  • 2205

使用WIN32汇编语言实现一个基本windows窗口的过程分析

一个常规的windows窗口一般都是一些一样的构造,你如果想要更改一些个性化的设置,你可以在这个一般的模板伤添砖加瓦,构造自己比较喜欢的类型,下边就分析一下一般的windows窗口的一般模板。 一...

改造联想Y480的快捷键(跨进程替换窗口过程的实现——远程线程注入)

前段时间入手了联想Y480N-IFI,在C面顶部有几个快捷按键。一键恢复、一键影音,这两个按键本身的功能对于本人是毫无作用, 我便想着能否改成像多媒体键盘那样有一些快捷键可以打开一些软件。正好这...

SDK学习笔记2-一个Win32窗口程序实现过程

Win32程序实现的步骤: WinMain函数的定义 创建一个窗口 1. 设计一个窗口类 2. 注册窗口类 3. 创建窗口 4. 显示及刷新窗口进行消息循环 完成回调函数 //WinMain...
  • nvcgkk
  • nvcgkk
  • 2016年12月03日 21:33
  • 320

模拟窗口创建过程

  • 2013年06月06日 11:42
  • 4.74MB
  • 下载

打造自己的MFC:thunk技术实现窗口类的封装

MFC功能已经非常强大,自己做界面库也许没什么意思,但是这个过程中却能学到很多东西。比如说: 窗口类的封装,从全局窗口消息处理到窗口对象消息处理的映射方法:     对界面进行封装,一般都是一...
  • weiqubo
  • weiqubo
  • 2011年12月07日 19:00
  • 1055
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:窗口过程封装的一些实现
举报原因:
原因补充:

(最多只允许输入30个字)