سؤال

لدي فئة CLISTCTRL وفي الوقت الحالي عندما يختار المستخدم أحد العناصر الفرعية التي أعرضها CCombobox عبر المرجع الفرعي الذي يمكن للمستخدم بعد ذلك إجراء عملية اختيار منه.

ومع ذلك لدي مشكلة. عندما قام المستخدم بإجراء اختيار أحتاج إلى تختفي مربع التحرير والسرد (أي اعتراض CBN_Selchange). المشكلة هي أنني بحاجة إلى جعل CCombobox طفل Clistctrl (وإلا فإنني أحصل على مشاكل غريبة في القائمة الرسم عبر مربع التحرير والسرد حتى إذا قمت بتعيين مربع التحرير والسرد لتكون أعلى). لذلك يتم إرسال رسالة CBN_Selchange إلى عرض القائمة الذي يتجاهله، مفهوم،. كيف يمكنني الحصول على عرض القائمة لتمرير تلك الرسالة إلى نافذة الأصل.

هل أحتاج حقا إلى استخلاص فئة CLISTCTRL الخاصة بي التي تعترض ببساطة رسالة cbn_selchange ويمرها إلى نافذة الأصل؟ هل هناك طريقة أفضل للقيام بذلك من إنشاء معالج ONWNDMSG؟

شكرا على اي مساعدة!

تحرير: يعمل هذا الرمز

class CPassThroughListCtrl : public CListCtrl
{
protected:
    virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
        if ( message == WM_COMMAND )
        {
            GetParent()->SendMessage( message, wParam, lParam );
        }
        return CListCtrl::OnWndMsg( message, wParam, lParam, pResult );
    }
public:
    CPassThroughListCtrl()
    {
    };
};

ولكن أود حقا أن أعرف ما إذا كان هناك طريقة أجمل للقيام بذلك.

هل كانت مفيدة؟

المحلول

يمكنك تصنيف Subclass CCombobox بحيث ستعامل مع رسالة CBN_Closeup. سيعرف التحرير والسرد المخصص الخاص بك عن المدير أي الكائن الذي أنشأه في المقام الأول وسيتعين عليك تدميره عند عن قرب (نافذة المستوى الأعلى أو أي شيء، يجب توفيره كوسيطة إلى منشئك المخصص ComboBox) ... هكذا عند إنشاء COMBOBOX في أعلى عنصر القائمة، ستخلق مثيل هذا الغلزات المخصصة بدلا من افتراضي MFC. يمكن أن تبدو معالج أحداث ComboBox:

BEGIN_MESSAGE_MAP(CNotifyingComboBox, CComboBox)
 ON_CONTROL_REFLECT(CBN_CLOSEUP, OnCloseUp)
END_MESSAGE_MAP()

void CNotifyingComboBox::OnCloseUp()
{
    // _manager is pointer to the object that created this combobox, 
    // and is responsible for its destruction, 
    // should be passed into CNotifyingComboBox cosntructor
    if( NULL != _manager )
    {
        _manager->OnCloseUpComboBox(this);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top