Win32 API
विंडोज उपवर्ग
खोज…
परिचय
विंडो सबक्लासिंग मानक विंडो प्रक्रिया में हुक करने और अपने डिफ़ॉल्ट व्यवहार को संशोधित या विस्तारित करने का एक तरीका है। एक अनुप्रयोग एक नई विंडो प्रक्रिया के साथ विंडो की मूल विंडो प्रक्रिया को प्रतिस्थापित करके एक विंडो को उप-वर्ग करता है। यह नई विंडो प्रक्रिया विंडो में भेजे गए या पोस्ट किए गए किसी भी संदेश को प्राप्त करती है।
वाक्य - विन्यास
- 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);
}
};