Win32 API
Windows subclassing
Sök…
Introduktion
Underklassning av fönster är ett sätt att ansluta till standardfönsterproceduren och ändra eller förlänga dess standardbeteende. En applikation underklasserar ett fönster genom att ersätta fönstrets ursprungliga fönsterprocedur med ett nytt fönsterprocedur. Den här nya fönsterproceduren tar emot alla meddelanden som skickas eller skickas till fönstret.
Syntax
- BOOL SetWindowSubclass (HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId, DWORD_PTR RefData);
- BOOL Ta bortWindowSubclass (HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId);
- BOOL GetWindowSubclass (HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId, DORD_PTR * RefData);
- LRESULT DefSubclassProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
parametrar
Parameter | Detalj |
---|---|
hWnd | Handtaget på fönstret för underklass. |
SubclassProc | Proceduren för återuppringning av underklass. |
SubclassId | Användar-specificerat ID för att identifiera underklassen, tillsammans med underklassproceduren identifierar unikt en underklass. Det kan helt enkelt vara ett godtyckligt antal i följd. |
REFDATA | Användarinformation. Betydelsen bestäms av ansökan. Det skickas till återkallning av underklass på omodifierat sätt. Det kan till exempel vara en objektpekare till en klassinstans. |
Anmärkningar
MSDN-dokumentation
Subclassing windows-knappkontroll inom C ++ -klassen
Detta exempel visar hur man manipulerar knappens idealstorlek genom att ange en fast storlek.
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);
}
}
Installera och ta bort underklassproceduren
Följande metoder installerar eller tar bort återuppringning av underklass. Kombinationen av SubclassId
och SubclassProc
identifierar unikt en underklass. Det finns ingen referensräkning, samtidigt ringa SetWindowSubclass
flera gånger med olika RefData
uppdaterar bara det värdet men kommer inte att göra att subklassen återuppringning kallas flera gånger.
BOOL SetWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId, DWORD_PTR RefData);
BOOL RemoveWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId);
För att hämta referensdata som skickades i det senaste SetWindowSubclass
samtalet kan man använda metoden GetWindowSubclass
.
BOOL GetWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId, DORD_PTR* RefData);
Parameter | Detalj |
---|---|
hWnd | Handtaget på fönstret för underklass. |
SubclassProc | Proceduren för återuppringning av underklass. |
SubclassId | Användar-specificerat ID för att identifiera underklassen, tillsammans med underklassproceduren identifierar unikt en underklass. Det kan helt enkelt vara ett godtyckligt antal i följd. |
REFDATA | Användarinformation. Betydelsen bestäms av ansökan. Det skickas till återkallning av underklass på omodifierat sätt. Det kan till exempel vara en objektpekare till en klassinstans. |
Underklassen återuppringning ansvarar för att ringa nästa hanterare i fönstret underklass kedja. DefSubclassProc
anropar nästa hanterare i fönstans underklasskedja. Den sista hanteraren anropar det ursprungliga fönstret. Det ska kallas i alla subklasserande återuppringningsprocedurer om inte meddelandet hanteras fullständigt av applikationen.
LRESULT DefSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
Parameter | Detalj |
---|---|
hWnd | Fönsterhandtag där meddelandet kommer från |
Msg | Fönstermeddelande |
wParam | WPARAM-argument, detta värde beror på specifikt fönstermeddelande |
lParam | LPARAM-argument, detta värde beror på specifikt fönstermeddelande |
SUBCLASSPROC
Det liknar WINDOWPROC
återuppringning men innehåller ett extra argument RefData
.
typedef LRESULT (CALLBACK *SUBCLASSPROC)(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam,
UINT_PTR SubclassId,
DWORD_PTR RefData
);
Hantering av vanliga kontrollmeddelanden i C ++ -klassen
class MyToolbarControl {
public:
MyToolbarControl(HWND hWndToolbar, HWND hWndNotifyParent = nullptr) : _Handle(hWndToolbar) {
if (hWndNotifyParent == nullptr) {
hWndNotifyParent = GetAncestor(hWndToolbar, GA_ROOTOWNER);
}
SetWindowSubclass(
hWndNotifyParent , SubclassWindowProc, reinterpret_cast<UINT_PTR>(this), reinterpret_cast<DWORD_PTR>(this)
);
}
~MyToolbarControl() {
RemoveWindowSubclass(
hWndNotifyParent , SubclassWindowProc, reinterpret_cast<UINT_PTR>(this), reinterpret_cast<DWORD_PTR>(this)
);
}
protected:
HWND _Handle;
static LRESULT CALLBACK SubclassWindowProc(
HWND hWnd, UINT Msg, WPARAM w, LPARAM l, UINT_PTR SubclassId, DWORD_PTR RefData) {
MyToolbarControl * w = reinterpret_cast<MyToolbarControl *>(RefData);
if (Msg == WM_NOTIFY) {
NMHDR* h = reinterpret_cast<NMHDR*>(l);
if (h->hwndFrom == w->_Handle) {
// Handle notification message here...
}
}
return DefSubclassProc(hWnd, Msg, w, l);
}
};