在 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);
}
}
安裝和刪除子類過程
以下方法安裝或刪除子類回撥。SubclassId
和 SubclassProc
的組合唯一地標識子類。沒有引用計數,用不同的 RefData
多次呼叫 SetWindowSubclass
只更新該值但不會導致多次呼叫子類回撥。
BOOL SetWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId, DWORD_PTR RefData);
BOOL RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId);
要檢索在最後一個 SetWindowSubclass
call 中傳遞的參考資料,可以使用 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
);