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);
    }
};


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow