`
isiqi
  • 浏览: 16759434 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

窗口过程封装的一些实现

阅读更多
-----------------------------------------------------------------------------------------------------------------
作者: 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;代码与第一个版本基本一致,只不过将属性表转换为哈希表了。
分享到:
评论

相关推荐

    一个不错的封装窗口的示例

    1. **定义窗口类**:窗口类包含了窗口的基本属性,如窗口过程(WndProc)——用于处理窗口消息的回调函数,窗口样式,背景颜色等。 2. **注册窗口类**:使用`RegisterClassEx`函数向系统注册新定义的窗口类,以便...

    win32窗口封装类_c++

    2. **初始化**:在类中提供一个初始化函数,用于设置窗口类属性,如窗口风格(WS_OVERLAPPEDWINDOW)、背景刷(hbrBackground)、窗口过程(WNDPROC)等。使用`RegisterClassEx`函数注册窗口类。 3. **窗口创建**:...

    win32内存窗口封装,示例

    子类化封装是Win32编程中的一个高级技巧,它允许我们将已有窗口的窗口过程替换为自定义的过程,这样我们可以在不改变原有窗口功能的基础上扩展或修改其行为。在本例中,可能我们会对标准的控件进行子类化,以便添加...

    获取另一个窗口的窗口过程_VC源码

    在实际开发中,除非有充分的理由,否则应避免修改其他应用程序的窗口过程,以尊重软件的封装性和安全性。 总之,这个VC源码示例提供了获取并可能修改其他窗口窗口过程的方法,这是Windows编程中的高级技巧,适用于...

    MFC实现窗口查看器 MFC实现窗口查看器

    接着,我们需要设计用户界面,可能包含一个列表控件(`CListCtrl`)来显示窗口列表,以及一些按钮,如“刷新”、“最小化”、“最大化”和“关闭”等。这些按钮的事件处理函数需要关联到对应的窗口操作API,如`...

    第一讲 封装简单Win32窗口类和DX入门 源码

    `WndProc`是窗口过程函数,它处理来自系统的各种消息,如鼠标点击、键盘输入和窗口大小改变。在封装的类中,`WndProc`通常会通过虚函数或消息映射机制进行重载,以便为特定的窗口类提供自定义的行为。 接下来,我们...

    IP数据封装过程

    ### IP数据封装过程详解 #### 一、概述 在计算机网络通信中,数据从源主机传输到目的主机的过程中,需要经过一系列的封装步骤。本文主要介绍的是基于TCP/IP协议族中的IP数据封装过程,这对于理解数据在网络中的...

    DuiLib实现异形窗口

    DuiLib提供了控件封装、事件处理、资源管理等一系列功能,极大地简化了Windows GUI应用的开发过程。 2. **异形窗口原理**: 在Windows系统中,通过使用层叠窗口(Layered Window)技术,可以实现窗口的透明度控制...

    qt封装cef 实现交互

    本文将详细介绍如何使用Qt封装CEF,以便在Qt窗口中展示Web内容并实现交互。 首先,Qt是一个功能强大的C++库,它提供了丰富的图形用户界面(GUI)组件和工具,可以用来开发运行在多种操作系统上的应用程序。而CEF则...

    易语言取窗口处理过程地址

    在易语言中,“取窗口处理过程地址”是一项关键的技术,主要用于获取与特定窗口相关的线程ID和进程ID,这对于系统级编程、软件调试以及一些高级功能的实现具有重要意义。 在Windows操作系统中,每个窗口都与一个...

    QT实现的自定义窗口框架

    开发者可能在这个类中重写了`QMainWindow`的一些方法,以实现特定的窗口行为。 1. **窗口的拖动**:在QT中,可以通过捕获鼠标事件来实现窗口拖动。通常,我们需要在`mousePressEvent`和`mouseMoveEvent`中处理这些...

    mfc窗口实现代码

    MFC窗口实现代码通常涉及一系列的类、方法和过程,用于构建图形用户界面(GUI)。在本项目中,"example6"很可能是包含了具体实现MFC窗口功能的一个示例代码文件。 MFC框架基于面向对象的设计,它将Windows编程中的...

    易语言纯API创建窗口源码

    4. **SetWindowLong/SetClassLong**:这些API用于设置窗口类或窗口实例的额外数据,比如可以用来设置窗口过程(Window Procedure)。 5. **ShowWindow**:用于显示或隐藏已创建的窗口。 6. **UpdateWindow**:确保...

    使非mfc窗口程序的窗口回调过程成为c++类的成员函数

    这样,我们就成功地将窗口过程和消息处理函数封装到了C++类的成员函数中。这种做法使得代码更加面向对象,易于理解和维护。在实际项目中,还可以进一步扩展CWndProc类,添加更多的抽象方法来处理各种消息,从而实现...

    易语言按窗口标题或类名枚举窗口

    "按窗口标题或类名枚举窗口"是指在枚举过程中,我们可以设置两个关键参数:窗口标题和窗口类名。窗口标题是我们看到的窗口上显示的文字,而窗口类名是操作系统用来标识窗口类型的内部名称。通过这两个参数,我们可以...

    C#操作窗口类(句柄操作)

    C#操作窗口类(句柄操作) C#操作窗口类是指使用C#语言编写的类来操作窗口,主要通过句柄操作来实现。...我们可以使用WinAPI函数来实现各种窗口操作,并封装这些函数到C#类中,以便于使用和管理。

    子类化窗口实现字幕翻译(雏形)

    这通常通过调用`SetWindowLong`或`SetWindowLongPtr`函数来实现,这两个函数允许我们替换窗口过程(Window Procedure),即处理窗口消息的函数。当我们为一个窗口设置新的窗口过程后,所有发往该窗口的消息都将先...

    WPF之自定义窗体的封装

    本文将深入探讨如何在WPF中封装自定义窗体,以及这一过程涉及的关键知识点。 首先,我们要理解WPF的基本架构。WPF是.NET Framework的一部分,它提供了丰富的UI框架,包括XAML(eXtensible Application Markup ...

    各类元器件封装查询图表

    5.BQFP 封装:带缓冲垫的四侧引脚扁平封装,QFP 封装之一,在封装本体的四个角设置突(缓冲垫)以防止在运送过程中引脚发生弯曲变形。 6.C 封装:陶瓷片式载体封装,表示陶瓷封装的记号。例如,CDIP 表示的是陶瓷...

    1:windows程序的一般步骤及其在MFC中的封装

    4. **窗口过程函数**(WndProc):每个窗口都有自己的窗口过程,负责处理发送到该窗口的消息。在上述示例中,`XjpProc`函数就是窗口过程,根据接收到的消息类型执行相应的操作。 在MFC中,上述步骤被封装到了MFC...

Global site tag (gtag.js) - Google Analytics