天下

记录修行的印记

窗口子类化的一般方法

实现子类化的一般方法
从上面可以看出,子类化主要使用几个API函数,这几乎是所有实现子类化相同的方法。相关API说明如下:
1、 WINUSERAPI LONG WINAPI GetWindowLongA(HWND hWnd, int nIndex);
WINUSERAPI LONG WINAPI GetWindowLongW(HWND hWnd,int nIndex);
2、 SetWindowLong 与 CallWindowProc 函数这不再列出来了,都是粉容易的!
使用 ComCtl32.dll version 6 实现窗口子类化
Windows XP 带的ComCtl32.dll version 6 提供了4个可以让创建子类化更简单,并且可以消除前面提到的缺陷的函数。这些新的函数封装了对多组参考数据(multiple sets of reference data)的管理操作,使得开发者能将精力集中到具体的程序特性而不是对子类的管理上。这些新的函数为:
SetWindowSubclass
GetWindowSubclass
RemoveWindowSubclass
DefSubclassProc
下面是对这些函数的描述。
SetWindowSubclass
这个函数用来子类化一个窗口。每个子类可以用p pfnSubclass 和 uIdSubclass (SetWindowSubclass的参数)唯一标识。多个子类可以共享同一个子类过程,而用标识(ID)来区分。改变参考数据可以提供再一次调用SetWindowSubclass 来实现。一个重要的优点是每一个子类实例可以拥有自己的参考数据。
子类过程的声明和传统的窗口过程有点细微的差别,它多了两个参数:子类ID和参考数据。参看下面这个函数声明的最后两个参数:
LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass,
DWORD_PTR dwRefData);
每次新的窗口过程收到一个消息时,它同时得到了一个子类ID和参考数据。
注意:所有作为参数传递给该函数的字符串均为Unicode,不管有没有定义Unicode编译选项。
GetWindowSubclass
该函数取回一个子类的信息。比如你可以用GetWindowSubclass 来访问参考数据。
RemoveWindowSubclass
该函数移除一个子类. RemoveWindowSubclass 和 SetWindowSubclass 联合使用可以动态添加和删除子类.
DefSubclassProc
这个函数调用子类链中的下一个处理者。这个函数可以自行取得正确的ID和参考数据并传递给下一个窗口过程。
大家都知道每个窗口都有默认的窗口函数来进行对窗口消息的处理.
OutputDebugString
SetProp()
SetWindowSubclass
BOOL SetWindowSubclass(          
    HWND hWnd,
    SUBCLASSPROC pfnSubclass,
    UINT_PTR uIdSubclass,
    DWORD_PTR dwRefData
);
SUBCLASSPROC
DefSubclassProc
LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg,WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass,DWORD_PTR dwRefData);

posted on 2015-08-10 10:02 天下 阅读(666) 评论(0)  编辑 收藏 引用 所属分类: Win32


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿(4)

随笔分类(377)

随笔档案(327)

链接

最新随笔

搜索

最新评论