2008-10-14 5 views
5

मैं सोच रहा था कि क्या (यदि कोई है) फंक्शन के लिए एमएफसी में निम्नलिखित दो संदेश जाल के बीच अंतर था, ऑनसाइज (..)।एमएफसी में संदेशों को फँसाना - क्या अंतर है?

1 - वाया संदेश नक्शा:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
... 
    ON_WM_SIZE() 
.. 
END_MESSAGE_MAP() 

2 - afx_message वाया:

afx_msg type OnSize(...); 

वे दूसरे के स्थान पर इस्तेमाल किया जा करने लगते हैं, जो एक प्रयोग किया जाना चाहिए या इसे अन्य कारकों पर निर्भर करता है?

उत्तर

12

दोनों भागों को कक्षा में एक संदेश हैंडलर जोड़ने की आवश्यकता है। किसी भी संदेश हैंडलर फ़ंक्शंस (उदाहरण के लिए, OnSize) के लिए घोषणाओं के साथ संदेश मानचित्र को आपकी कक्षा के अंदर घोषित किया जाना चाहिए।

class CClassWnd : public CBaseClassWnd { 
    ... 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    DECLARE_MESSAGE_MAP 
}; 

afx_msg सिर्फ एक खाली प्लेसहोल्डर मैक्रो है - यह वास्तव में कुछ भी नहीं है, लेकिन हमेशा सम्मेलन से शामिल किया गया है।

संदेश नक्शा तो वर्ग के .cpp फ़ाइल में परिभाषित किया गया है:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

ये मैक्रो वर्ग जो खिड़की द्वारा प्राप्त संदेशों इसी हैंडलर कार्यों के लिए भेजा जा करने के लिए अनुमति देता है के लिए एक लुकअप तालिका उत्पन्न करते हैं। ON_WM_SIZE मैक्रो और lParam संदेश पैरामीटर WM_SIZE संदेश संदेश संदेश हैंडलर फ़ंक्शन (nType, cx, और cy इस मामले में) के लिए अधिक सार्थक मानों में डीकोड करने की अनुमति देता है। एमएफसी अधिकांश विंडो संदेशों के लिए मैक्रोज़ प्रदान करता है (WM_LBUTTONDOWN, WM_DESTROY, आदि)।

आप एमएसएफएन पर एमएफसी here में संदेश मानचित्र कैसे काम करते हैं, इस बारे में अधिक जानकारी प्राप्त कर सकते हैं।

3

afx_msg सिर्फ एक खाली मैक्रो है, यह मूल रूप से केवल यह इंगित करने के लिए है कि विधि पठनीयता उद्देश्यों के लिए एक एमएफसी संदेश हैंडलर है। यहां तक ​​कि afx_msg के साथ भी आपको संदेश मानचित्र में प्रवेश करने की आवश्यकता है।

+0

यह जानकर अच्छा लगा कि कुछ समय के लिए मैंने कुछ सोचा है। शायद मेरे हाथों में बस इतना समय है ...;) –

0

कुछ विंडोज संदेश पहले ही एमएफसी द्वारा संभाले गए हैं, इसलिए इन मामलों में आप अपनी व्युत्पन्न कक्षा में केवल विधि जोड़ने के साथ दूर हो सकते हैं।

उदाहरण के लिए CWnd वर्ग (कई अन्य MFC कक्षाओं करते हैं) पहले से ही इस पर कुछ विंडोज संदेशों नक्शे संदेश नक्शा है (अर्थात ON_WM_DRAWITEM, ON_WM_MEASUREITEM, ON_WM_ENTERIDLE आदि, आदि)।

लेकिन एमएफसी द्वारा पहले से मैप किए गए किसी भी अन्य संदेश को काम करने के लिए संदेश मानचित्र में एक क्लास विधि और प्रविष्टि दोनों की आवश्यकता होगी।

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