2015-05-18 5 views
10

WM_NEXTDLGCTL राज्यों के लिए प्रलेखन, कि इस संदेश को संवाद के साथ प्रयोग किया जा सकता है:क्या WM_NEXTDLGCTL गैर-संवाद विंडो के साथ उपयोग किया जा सकता है?

संवाद बॉक्स में एक अलग नियंत्रित करने के लिए, कीबोर्ड स्थापित करने के लिए एक संवाद बॉक्स प्रक्रिया पर भेजा गया।

इस संदेश को गैर संवाद नियंत्रण माता पिता के साथ नहीं किया जा सकता है, यह एक सामान्य तरीका (this question में दर्शाया गया है) में उपवर्ग नियंत्रण के लिए बहुत कठिन होगा क्योंकि खिड़की प्रक्रिया फोन या तो SetFocus या भेजने के लिए होता है एक WM_NEXTDLGCTL संदेश, संदर्भ निर्धारित करने के लिए काफी तुच्छ नहीं है।

चूंकि अन्य संवाद-विशिष्ट API का उपयोग गैर-संवाद विंडो (उदा। IsDialogMessage) के साथ किया जा सकता है, इसलिए यह भी इस सेटअप में WM_NEXTDLGCTL का उपयोग करने में सक्षम होना स्वाभाविक होगा।

प्रश्न:WM_NEXTDLGCTL गैर-संवाद नियंत्रण माता-पिता के साथ उपयोग किया जा सकता है?

उत्तर

11

क्या WM_NEXTDLGCTL गैर-संवाद नियंत्रण माता-पिता के साथ उपयोग किया जा सकता है?

मुझे नहीं लगता कि आप इसे गैर-संवाद माता-पिता विंडो (कम से कम मूल विंडो में कोई बदलाव नहीं) में उपयोग कर सकते हैं, इसका कारण यह है कि इसे DefDlgProc के अंदर लागू किया गया है। तो इस संदेश को काम करने के लिए आपकी अन्य गैर-संवाद विंडो को इसे कॉल करना होगा।

यह बोली मैं द ओल्ड नई बात में पाया है है: विंडोज के विकास के दौरान व्यावहारिक विकास: DefDlgProc अंदर क्या होता है?

WM_NEXTDLGCTL संदेश के लिए टिप्पणी निरीक्षण के रूप में, DefDlgProc समारोह सभी आंतरिक संवाद प्रबंधक बहीखाता को अद्यतन करने, निर्णय लेने से जो बटन डिफ़ॉल्ट, वह सब अच्छी चीजें होना चाहिए द्वारा WM_NEXTDLGCTL संदेश संभालती है।

सेट डिफ़ॉल्ट नियंत्रण पहचानकर्ता

यह करने के लिए इसे भेजने चाहिए:

एक और कारण है कि यह केवल संदेश संवाद है तथ्य यह है कि यह (WM_NEXTDLGCTL के लिए MSDN से उद्धरण) है DM_SETDEFID है, जो के रूप में परिभाषित किया गया है:

#define DM_SETDEFID   (WM_USER+1) 

तो यह WM_USER है, और इस तरह के रूप में यह प्रयोग किया जा सकता गैर संवाद विंडो पर किसी अन्य उद्देश्य के लिए (इस तथ्य का भी रेमंड कैन्स बुक में उल्लेख किया गया है)। दिलचस्प बात यह है कि इस पुस्तक के अनुसार IsDialogMessage भी आपकी विंडो में DM_SETDEFID/DM_GETDEFID भेजता है। तो यदि आप अपने अंदर नेविगेशन जैसे टीएबी का उपयोग करना चाहते हैं तो गैर डायलॉग विंडो (डायलॉग कोड का उपयोग करके), आपको कुछ नियमों का पालन करना होगा, आप इन्हें अंदर पढ़ सकते हैं: What happens inside IsDialogMessage? उपरोक्त पुस्तक के।

while (GetMessage(&msg, NULL, 0, 0)) { 
    if (IsDialogMessage(hwnd, &msg)) { 
     /* Already handled by dialog manager */ 
    } else { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

इसलिए यदि आप न अपने माता पिता खिड़कियों कोड में कई परिवर्तन करना चाहते हैं, तो मुझे डर है कि तुम भाग्य से बाहर हैं हूँ: यह निम्न संदेश पाश उपयोग करने के लिए अन्य लोगों के अलावा मतलब है।

+0

यह काफी दृढ़ता से लगता है, खासकर जब विंडो क्लास निजी संदेश ('WM_USER + x') शामिल होते हैं। फिर भी, [DM_SETDEFID] के लिए प्रलेखन (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645413.aspx) नोट्स: * "डिफ़ॉल्ट पुश बटन सेट करने के लिए, फ़ंक्शन ** भेज सकता है WM_GETDLGCODE ** और ** BM_SETSTYLE ** निर्दिष्ट नियंत्रण और वर्तमान डिफ़ॉल्ट पुश बटन पर संदेश। "* तो सिद्धांत में,' DM_SETDEFID' को कड़ाई से जरूरी नहीं है। जबकि मुझे लगता है कि आप सही हैं, तर्क में अभी भी एक अंतर है। – IInspectable

संबंधित मुद्दे