1. 程式人生 > >鉤子實現子類化

鉤子實現子類化

在使用控制元件過程中,如果我們需要擷取控制元件具有的部分功能,我們可以將其子類化,然後在使用原來控制元件的基礎上呼叫自定義控制元件具有的相關功能。

例如一個按鈕的例子,在對話方塊中安置一個按鈕,然後自己重新從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);

}