103 lines
3.8 KiB
C
103 lines
3.8 KiB
C
|
|
#ifndef _CLASSED_WINDOW_PROC_H_
|
|||
|
|
#define _CLASSED_WINDOW_PROC_H_
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 将窗口回调函数调用到类的窗口处理函数中的窗口基础类
|
|||
|
|
* 子类可以通过覆盖WndProc函数来实现在类中的消息处理
|
|||
|
|
* 注意: 此类不是多线程安全的!
|
|||
|
|
*
|
|||
|
|
* 实现原理简介:
|
|||
|
|
* Windows窗口消息处理不支持分页处理,也无法传递相关的穿透参数来实现对类指针的
|
|||
|
|
* 传递。在MFC中,通过将所有窗口的处理函数指向一个固定的函数,在创建类型的时候会将
|
|||
|
|
* 窗口的类型注册到一个全局的map中,并在消息处理的时候从map中查找窗口句柄对应的类
|
|||
|
|
* 实例并调用其消息处理函数。这样的做法在窗口组件较多且消息频繁的时候在通过map查找
|
|||
|
|
* 类实例的时候有较大的性能瓶颈,因为每处理一个消息都要从“窗口-实例”映射表中查找窗
|
|||
|
|
* 口对应的类实例。
|
|||
|
|
*
|
|||
|
|
* 本分页消息处理模型参考自VCL的分页化消息处理机制,采用运行时动态打内存执行代码
|
|||
|
|
* 补丁的形式实现窗口消息的类化处理,没有任何的查询操作的额外开销,性能较高。
|
|||
|
|
*
|
|||
|
|
* 使用方式:
|
|||
|
|
* 1)继承此类,覆盖保护函数WndProc以便完成消息处理;
|
|||
|
|
* 2)在注册窗口类型的时候,将窗口处理函数设置为getClassedWndProc()函数的返
|
|||
|
|
* 回值;
|
|||
|
|
* 3)创建窗口实例的时候,调用MyCreateWindowEx不要调用全局的CreateWindow或
|
|||
|
|
* CreateWindowEx函数;
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
namespace wylib
|
|||
|
|
{
|
|||
|
|
namespace window
|
|||
|
|
{
|
|||
|
|
#ifndef __GNUC__
|
|||
|
|
|
|||
|
|
// 此类仅限于Windows下使用
|
|||
|
|
class CClassedWnd
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
|
|||
|
|
inline HWND getHwnd(){ return m_hWnd; }
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取窗口类的WndProc函数,以便在RegistClass或SetWindowLong中
|
|||
|
|
* 设置支持类函数化的消息处理的窗口机制
|
|||
|
|
* 在注册类型或改变窗口处理函数的时候,使用此函数的返回值作为窗口处理函数,
|
|||
|
|
* 才能正确的实现窗口消息的类化处理
|
|||
|
|
*/
|
|||
|
|
WNDPROC getClassedWndProc();
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 窗口消息处理的需函数
|
|||
|
|
* 子类必须覆盖此函数以实现对窗口消息的处理
|
|||
|
|
*/
|
|||
|
|
virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 通过内部实现CreateWindowEx函数以便完成对窗口消息类化处理所必要的操作
|
|||
|
|
*/
|
|||
|
|
HWND MyCreateWindowEx(DWORD dwExStyle,
|
|||
|
|
LPCTSTR lpClassName,
|
|||
|
|
LPCTSTR lpWindowName,
|
|||
|
|
DWORD dwStyle,
|
|||
|
|
int x,
|
|||
|
|
int y,
|
|||
|
|
int nWidth,
|
|||
|
|
int nHeight,
|
|||
|
|
HWND hWndParent,
|
|||
|
|
HMENU hMenu,
|
|||
|
|
HINSTANCE hInstance,
|
|||
|
|
LPVOID lpParam
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 以下函数或成员为类私有数据,为实现窗口消息的类化处理的内部实现的函数或数据声明
|
|||
|
|
*/
|
|||
|
|
static CClassedWnd* CreationWnd;
|
|||
|
|
|
|||
|
|
static LRESULT APIENTRY InitClassedWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|||
|
|
|
|||
|
|
static LRESULT APIENTRY StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, CClassedWnd *pWnd);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
HWND m_hWnd; //窗口句柄
|
|||
|
|
|
|||
|
|
WNDPROC m_pClassWndProcInst; //窗口消息类化处理实例
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
CClassedWnd(void);
|
|||
|
|
|
|||
|
|
virtual ~CClassedWnd(void);
|
|||
|
|
};
|
|||
|
|
#endif
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|