खोज…


परिचय

विंडो सबक्लासिंग मानक विंडो प्रक्रिया में हुक करने और अपने डिफ़ॉल्ट व्यवहार को संशोधित या विस्तारित करने का एक तरीका है। एक अनुप्रयोग एक नई विंडो प्रक्रिया के साथ विंडो की मूल विंडो प्रक्रिया को प्रतिस्थापित करके एक विंडो को उप-वर्ग करता है। यह नई विंडो प्रक्रिया विंडो में भेजे गए या पोस्ट किए गए किसी भी संदेश को प्राप्त करती है।

वाक्य - विन्यास

  • BOOL SetWindowSubclass (HWND hWnd, SUBCLASSPROC उपक्लासप्रोक, UINT_PTR उप-वर्ग, DWORD_PTR RefData);
  • BOOL RemoveWindowSubclass (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);

पैरामीटर

पैरामीटर विस्तार
hWnd उपवर्ग के लिए विंडो का हैंडल।
SubclassProc उपवर्ग कॉलबैक प्रक्रिया।
SubclassId उप-वर्ग की पहचान करने के लिए उपयोगकर्ता द्वारा निर्दिष्ट आईडी, उप-वर्ग प्रक्रिया के साथ मिलकर विशिष्ट रूप से एक उप-वर्ग की पहचान करता है। यह बस एक मनमाना लगातार संख्या हो सकती है।
RefData उपयोगकर्ता निर्दिष्ट डेटा। अर्थ एप्लिकेशन द्वारा निर्धारित किया जाता है। इसे अनमोल तरीके से उपवर्ग कॉलबैक में पारित किया जाता है। यह उदाहरण के लिए एक वर्ग उदाहरण के लिए एक वस्तु सूचक हो सकता है।

टिप्पणियों

MSDN प्रलेखन

C ++ वर्ग के भीतर उपविभाजन विंडोज़ बटन नियंत्रण

यह उदाहरण दिखाता है कि एक निश्चित आकार निर्दिष्ट करके बटन आदर्श आकार में हेरफेर कैसे करें।

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 कॉल RefData केवल उस मूल्य को अपडेट करता है लेकिन कई बार RefData कॉलबैक का कारण नहीं होगा।

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

पिछले SetWindowSubclass कॉल में दिए गए संदर्भ डेटा को पुनः प्राप्त करने के लिए, कोई GetWindowSubclass पद्धति का उपयोग कर सकता है।

BOOL GetWindowSubclass(HWND hWnd, SUBCLASSPROC SubclassProc, UINT_PTR SubclassId, DORD_PTR* RefData);
पैरामीटर विस्तार
hWnd उपवर्ग के लिए विंडो का हैंडल।
SubclassProc उपवर्ग कॉलबैक प्रक्रिया।
SubclassId उप-वर्ग की पहचान करने के लिए उपयोगकर्ता द्वारा निर्दिष्ट आईडी, उप-वर्ग प्रक्रिया के साथ मिलकर विशिष्ट रूप से एक उप-वर्ग की पहचान करता है। यह बस एक मनमाना लगातार संख्या हो सकती है।
RefData उपयोगकर्ता निर्दिष्ट डेटा। अर्थ एप्लिकेशन द्वारा निर्धारित किया जाता है। इसे अनमोल तरीके से उपवर्ग कॉलबैक में पारित किया जाता है। यह उदाहरण के लिए एक वर्ग उदाहरण के लिए एक वस्तु सूचक हो सकता है।

उपवर्ग कॉलबैक विंडो की उपवर्ग श्रृंखला में अगले हैंडलर को कॉल करने के लिए जिम्मेदार है। DefSubclassProc विंडो के उपवर्ग श्रृंखला में अगले हैंडलर को कॉल करता है। अंतिम हैंडलर मूल विंडो प्रक्रिया को कॉल करता है। यह किसी भी उपवर्ग कॉलबैक प्रक्रिया में बुलाया जाना चाहिए जब तक कि संदेश पूरी तरह से आवेदन द्वारा नियंत्रित न हो।

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

C ++ वर्ग के भीतर सामान्य नियंत्रण सूचना संदेशों को संभालना

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
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow