2009-05-13 13 views
7

कल्पना कीजिए कि मेरे पास एक सीडीअलॉग है जो उपयोगकर्ता बटन पर क्लिक करते समय गतिशील रूप से नियंत्रण बनाता है। यह इस तरह हो सकता है:किसी एमएफसी ऐप में गतिशील रूप से बनाए गए नियंत्रणों से संदेशों को कैसे प्रबंधित करें?

// We don't know which is the first id for the new buttons until runtime (!) 
MyDialog::MyDialog(/*whatever parameters needed*/, first_id) 
    : next_id_(first_id) 
{ /*...*/ } 

BOOL MyDialog::OnSomeButtonClicked() 
{ 
    CButton* new_button = new CButton; 
    new_button->Create("Caption", WS_CHILD | WS_VISIBLE, this->new_button_rect_, 
        this, this->next_id_++); 
} 

तब मेरा प्रश्न होगा: मैं इस बटन से संदेशों को कैसे संभाल सकता हूं? क्या एमएफसी संदेश मानचित्र सुविधा का उपयोग करना संभव है?

समाधान दोनों बनाम 6 और बनाम2005 में काम करना चाहिए।

धन्यवाद!

उत्तर

6

ये समाधान मैं अब तक प्रासंगिकता के क्रम में प्राप्त होते हैं:

  1. उपयोग ON_COMMAND_RANGE यदि आप नियंत्रण ID आप हैंडल करना चाहते हैं की सीमा निर्धारित कर सकते हैं।

  2. अधिभार CWnd::PreTranslateMessage() और प्राप्त संदेशों के साथ जो कुछ भी आप चाहते हैं वह करें। नोट: बटन से निपटने पर, ध्यान रखें कि BN_CLICKED ईवेंट प्रीट्रांसलेट मैसेज पर नहीं भेजा गया है लेकिन सीधे विंडो प्रक्रिया में भेजा गया है।

  3. अधिभार CWnd::WindowProc() और प्राप्त संदेशों के साथ जो कुछ भी आप चाहते हैं वह करें। ध्यान दें कि बटन से निपटने पर यह केवल एक ही तरीका है जिसे मैंने BN_CLICKED ईवेंट को संभालने के लिए पाया है।

लिंक दिलचस्प:

मुझे आशा है कि इस मदद करता है ... आप सभी अपने योगदान के लिए धन्यवाद देता हूं।

0

मेरा मानना ​​है कि यह आलेख इसे बहुत अच्छी तरह से समझाता है और इसमें स्रोत कोड है। मैंने यह कोशिश नहीं की है इसलिए मैं इसे काम करने की गारंटी नहीं दे सकता, लेकिन उस समय मैंने सोचा कि इससे मदद मिल सकती है।

Article

+0

ठीक है, यह सामान के इस तरह के PreTranslateMessage उपयोग करने के लिए शायद ठीक है, लेकिन मैं सोच वहाँ MFC संदेश नक्शा सुविधा का उपयोग करने के लिए एक तरीका है पर रखने: एस –

5

Eventhough आप आईडी का सही मूल्यों पता है, अगर आप आईडी की संभव रेंज उसके बाद निम्न मैक्रो इस्तेमाल किया जा सकता नहीं जानता।

BEGIN_MESSAGE_MAP(MyDialog, CDialog) 
    ... 
    ... 
    ON_COMMAND_RANGE(1000, 5000, OnButtonDynamic) 
END_MESSAGE_MAP() 


void MyDialog::OnButtonDynamic(UINT nID) 
{ 

} 

इस रेंज 1000 में आईडी के लिए काम करेगा - 5000

+0

Uhm, जवाब के लिए धन्यवाद, लेकिन मैं अग्रिम सीमा को कैसे जान सकता हूं? –

0

आप विवरण (+ एक बहुत अधिक) मोडहीन संवाद there पर पा सकते हैं।

+0

मुझे लगता है कि यह काफी असंबंधित है: एस –

0

Resouce.h में हैंडलर की आईडी प्रविष्टि सम्मिलित फिर ON_BN_CLICKED तरह हैंडलर के संदेश नक्शे में प्रवेश (IDC_BTNCREATE, OnBnClickedrunCreated) डालने या आप सीधे ON_BN_CLICKED (1200, OnBnClickedrunCreated तरह पूर्णांक आईडी का उपयोग कर सकते)। यदि आप दूसरे संस्करण का उपयोग करते हैं तो संसाधन.h में प्रविष्टि डालने की आवश्यकता नहीं है। .h और .cpp फ़ाइल में हैंडलर की परिभाषा और घोषणा दें। आपको अपना जवाब मिल जाएगा।

2

मैं इस पार्टी के कुछ साल बाद देर से हूं, लेकिन इसका समाधान प्रत्येक बटन पर एक ही नियंत्रण आईडी असाइन करना है (संसाधन में 'आरक्षित' आईडी की आवश्यकता नहीं है।ज, और नियंत्रण की राशि बनाया जा सकता है उस पर कोई कृत्रिम प्रतिबंध), खिड़की संभाल को बचाने के लिए और उस बटन के लिए हैंडलर में GetCurrentMessage() का उपयोग करने के लिए:

// resource.h 
#define IDC_DYNAMIC_BUTTON 123 

// In message map 
ON_BN_CLICKED(IDC_DYNAMIC_BUTTON, OnDynamicButtonClicked) 

// Store the window handles when creating them in a member: 
std::map<HWND, SomeStruct> m_Buttons; 
... fill this map when creating the buttons, presumably in OnInitDialog() 

// Actual handler 
void MyDialog::OnDynamicButtonClicked() 
{ 
    const MSG* message = GetCurrentMessage(); 

    if (m_Buttons.find((HWND)message->lParam) != m_Buttons.end()) { 
     // Do something with m_Buttons[(HWND)message->lParam] 
    } 
} 
0

इस तरह का प्रयोग करें: ON_CONTROL_RANGE (wNotifyCode, आईडी 1, आईडी 2, सदस्य एफएक्सएन)। उदाहरण के लिए :

ON_CONTROL_RANGE(EN_UPDATE, IDC_EDIT_START, IDC_EDIT_END, OnEnUpdateEditParams) 
संबंधित मुद्दे