在 C 類中對 windows 按鈕控制元件進行子類化

此示例顯示如何通過指定固定大小來操作按鈕理想大小。

class ButtonSubclass {
public:

    ButtonSubclass(HWND hWndButton) {
        SetWindowSubclass(hWndButton, MyButtonSubclassProc, 1, (DWORD_PTR) this);
    }
    ~ButtonSuclass() {
        RemoveWindowSubclass(hWndButton, MyButtonSubclassProc, 1, (DWORD_PTR) this);
    }

protected:

    static LRESULT CALLBACK MyButtonSubclassProc(
           HWND hWnd, UINT Msg, WPARAM w, LPARAM l, DWORD_PTR RefData) {

        ButtonSubclass* o = reinterpret_cast<ButtonSubclass*>(RefData);

        if (Msg == BCM_GETIDEALSIZE) {
            reinterpret_cast<SIZE*>(lParam)->cx = 100;
            reinterpret_cast<SIZE*>(lParam)->cy = 100;
            return TRUE;
        }
        return DefSubclassProc(hWnd, Msg, w, l);
    }
}

安裝和刪除子類過程

以下方法安裝或刪除子類回撥。SubclassIdSubclassProc 的組合唯一地標識子類。沒有引用計數,用不同的 RefData 多次呼叫 SetWindowSubclass 只更新該值但不會導致多次呼叫子類回撥。

BOOL SetWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId, DWORD_PTR RefData);
BOOL RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId);

要檢索在最後一個 SetWindowSubclasscall 中傳遞的參考資料,可以使用 GetWindowSubclass 方法。

BOOL GetWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId, DORD_PTR* RefData);
引數 詳情
hWnd 子視窗的控制代碼。
SubclassProc 子類回撥過程。
SubclassId 使用者指定的 ID 用於標識子類,以及子類過程唯一標識子類。它可以簡單地是任意連續的數字。
RefData 使用者指定的資料。含義由申請決定。它以未修改的方式傳遞給子類回撥。例如,它可以是指向類例項的物件指標。

子類回撥負責呼叫 window 的子類鏈中的下一個處理程式。DefSubclassProc 呼叫 window 的子類鏈中的下一個處理程式。最後一個處理程式呼叫原始視窗過程。它應該在任何子類回撥過程中呼叫,除非訊息完全由應用程式處理。

LRESULT DefSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
引數 詳情
hWnd 訊息源自的視窗控制代碼
訊息 視窗訊息
wParam 中 WPARAM 引數,此值取決於特定的視窗訊息
lParam LPARAM 引數,此值取決於特定的視窗訊息

SUBCLASSPROC

它類似於 WINDOWPROC 回撥,但包含一個額外的引數 RefData

typedef LRESULT (CALLBACK *SUBCLASSPROC)(
    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam,
    UINT_PTR SubclassId,
    DWORD_PTR RefData
);