在使用控件过程中,如果我们需要截取控件具有的部分功能,我们可以将其子类化,然后在使用原来控件的基础上调用自定义控件具有的相关功能。
例如一个按钮的例子,在对话框中安置一个按钮,然后自己重新从CButton派生CButtonEx类,在初始化时将控件子类化为自己的派生控件,
然后用SubclassWindow将其子类化。
最后使用在取消子类化,UnSubclassWindow。
下面举例实现用钩子对属于button类名的控件子类化。该例程来自互联网。
实现方法:
1.定义自己的控件类,比如CButtonEx:public CButton,实现自绘。
2.安装WH_CALLWNDPROC钩子
a.定义HHOOK全局变量
HHOOK g_WndProcHook=NULL;
b.在CXXAPP ::InitInstance()中安装钩子
g_WndProcHook=SetWindowsHookEx(
WH_CALLWNDPROC,
(HOOKPROC)CallWndProc,
NULL,
GetCurrentThreadId());
c.在CXXAPP::ExitInstance()中删除钩子
UnhookWindowsHookEx(g_WndProcHook);
d.在CallWndProc中子类化控件
LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (HC_ACTION==nCode)
{
CWPSTRUCT* lpCWPSTRUCT=(CWPSTRUCT*) lParam;
HWND hWnd=lpCWPSTRUCT->hwnd;
char szClassName[512];
::GetClassName(hWnd,szClassName,512);
switch (lpCWPSTRUCT->message)
{
case WM_CREATE:
{
if (strcmp(szClassName,"Button")==0)
{
//在这里开始子类化
CButtonEx*pBtn=newCButtonEx();
pBtn->SubclassWindow(hWnd);
}
break;
}
case WM_NCDESTROY:
{
//取消子类化
//pBtn->UnsubclassWindow();
break;
}
default:
break;
}
}
return CallNextHookEx(g_WndProcHook,nCode,wParam,lParam);
}