窗口过程封装的一些实现

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

 

-----------------------------------------------------------------------------------------------------------------
作者:  colin<linzhenqun@gmail.com>
-----------------------------------------------------------------------------------------------------------------
如何封装窗口过程是所有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界面封装(五) 之 封装第一个控件:按钮

Button是我们遇到的最多的控件之一,因此以它来作为入手控件还是很合适的。       通常我们见到的Button都是有窗口控件,当然也有很多优秀的库为了提高效率做成无窗口控件。所有有窗口和无窗口...
  • cheneywong
  • cheneywong
  • 2013年04月26日 22:31
  • 873

Selenium常用方法的封装

import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.sele...
  • yjlch1016
  • yjlch1016
  • 2017年11月11日 15:35
  • 239

OSI模型中的数据封装与解封装过程

数据封装(Data Encapsulation),笼统地讲,就是把业务数据映射到某个封装协议的净荷中,然后填充对应协议的包头,形成封装协议的数据包,并完成速率适配。       在OSI参考...
  • Ssxysxy123
  • Ssxysxy123
  • 2015年11月18日 10:56
  • 3143

简单的WIN32窗口封装

封装窗口对象。 (注意。有些命名我是直接复制win32API的,会不规范)本来是想直接用虚函数来处理消息的,但是消息很多,写的会很吃力,所以采用类似MFC的消息映射,现在内存是很富裕的,不用担心虚函...
  • qq_27118889
  • qq_27118889
  • 2016年08月04日 15:53
  • 756

Java+Selenium3框架设计篇2-Selenium方法的二次封装和页面基类

前面我们介绍了如何设计支持不同浏览器测试,我们的解决方法是,通过切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试。我们暂且叫浏览器引擎类,这个类负责获取浏览器类型和启动不同浏览器,并...
  • u011541946
  • u011541946
  • 2017年08月06日 22:57
  • 1630

3.1 面向对象的窗口类的封装

汽车产业生产初期,靠手工制件,所以效率极低; 随着工业发展,引入了汽车生产线,从而汽车可以批量生产,生产力水平大大提高。 同理,如果我们每次创建窗口,都要完成上百行代码,如果创建多的话,重复工作量太...
  • lsfreeing
  • lsfreeing
  • 2014年11月13日 08:56
  • 703

windows下cmd窗口中一些命令使用

ping命令,检测两个电脑通信情况。 ping 192.168.1.100 -t  -t命令可以让命令一直执行,只要不是人为的中断。 命令行重定向: 在命令里,想要将所有的执行命令结果保...
  • Xjack2012
  • Xjack2012
  • 2014年03月13日 13:33
  • 966

TCP/IP五层模型消息解/封装仿真

消息封/解装仿真功能要求按照TCP五层模型仿真消息在两台主机之间的通信过程。 1. 在发送端模拟数据从高层到低层的封装过程,在接收端模拟数据从低层到高层的解封装过程。 2. 按照每层的功能对数据填...
  • b735098742
  • b735098742
  • 2017年12月09日 13:40
  • 304

OSI参考模型中的数据封装及解封装过程

如图所示,在OSI参考模型中,当一台主机需要传送用户的数据(DATA)时,数据首先通过应用层的接口进入应用层。在应用层,用户的数据被加上应用层的报头(Application Header,AH),形成...
  • qq_14935437
  • qq_14935437
  • 2017年05月02日 15:11
  • 708

网络数据包封装过程

当我们在七层协议最上层,主机A想和其它主机通信, 比如telnet到主机B,各层都为数据打包后再封装上自己能识别的数据标签,现在我们只说四层以 下的通信过程。 1、当一个高层的数据包到...
  • u011828411
  • u011828411
  • 2014年03月26日 20:00
  • 1267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:窗口过程封装的一些实现
举报原因:
原因补充:

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