سؤال

أحاول إضافة عنصر قائمة مثل أن يتصرف مثل علامة الاختيار حيث يمكن للمستخدم الاختيار/إلغاء ، الطبقات الأخرى يمكن أن نرى أن عنصر القائمة هو وضع علامة الاختيار.وصلتني اقتراح إنشاء فئة خيار القائمة (مع المنبثقة خيار), ومع ذلك, لا يمكن إنشاء فئة على خيار القائمة عندما أكون في الموارد محرر تخطيط في Visual Studio 2005.سيكون أمرا رائعا أن نسمع اقتراحات حول أسهل طريقة لإنشاء قائمة من البنود التي يمكن أن تفعل ما وصفتها.

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

المحلول 3

وانتهى بي الأمر استرجاع القائمة من أجهزة الكمبيوتر المركزية باستخدام GetMenu () الأسلوب، وتستخدم بعد ذلك أن أعدادا الكائن القائمة وID للاتصال CheckMenuItem () مع رايات الحق، وكذلك GetMenuState () وظيفة.

نصائح أخرى

يجب عليك استخدام CCmdUI::SetCheck وظيفة إضافة مربع إلى عنصر القائمة ، عبر ON_UPDATE_COMMAND_UI معالج وظيفة ، ON_COMMAND معالج لتغيير حالة خانة الاختيار.يعمل هذا الأسلوب على حد سواء للحصول على التطبيق الخاص بك القائمة الرئيسية لأي القوائم المنبثقة قد خلق.

على افتراض لديك MDI أو المكانية التطبيق MFC يجب عليك أولا أن تقرر أين تريد إضافة معالج الدالات على سبيل المثال في تطبيق الإطار الرئيسي ، الوثيقة ، أو عرض الصف.هذا يعتمد على ما العلم سيتم استخدامها من أجل:إذا كان ضوابط تطبيق على نطاق السلوك ، ووضعها في تطبيق الطبقة ؛ إذا كانت الضوابط نظر محددة السلوك في عرض الصف ، وما إلى ذلك.

(كما أنصح خروجه من القائمة العنصر فحص العقار في محرر الموارد تعيين كاذبة.)

هنا مثال باستخدام فئة الرأي للتحكم في خانة الدولة من ID_MY_COMMAND عنصر القائمة:

// MyView.h

class CMyView : public CView
{
private:
    BOOL m_Flag;

    afx_msg void OnMyCommand();
    afx_msg void OnUpdateMyCommand(CCmdUI* pCmdUI);
    DECLARE_MESSAGE_MAP()
};

// MyView.cpp

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_MY_COMMAND, OnMyCommand)
    ON_UPDATE_COMMAND_UI(ID_MY_COMMAND, OnUpdateMyCommand)
END_MESSAGE_MAP()

void CMyView::OnMyCommand()
{
    m_Flag = !m_Flag; // Toggle the flag
    // Use the new flag value.
}

void CMyView::OnUpdateMyCommand(CCmdUI* pCmdUI)
{
    pCmdUI->SetCheck(m_Flag);
}

يجب عليك ضمان m_Flag عضو متغير initialised ، على سبيل المثال ، في CMyView منشئ أو OnInitialUpdate وظيفة.

آمل أن يساعد هذا!

@ChrisN هذا النهج لا يعمل تماما على MFC الحوار التطبيقات (إن pCmdUI->SetCheck(m_Flag); ليس له أي تأثير).هنا هو الحل بالنسبة الحوار تطبيقات:

// MyView.h

class CMyView : public CView
{
private:
    BOOL m_Flag;
    CMenu * m_menu;

    virtual BOOL OnInitDialog();
    afx_msg void OnMyCommand();
    DECLARE_MESSAGE_MAP()
};

// MyView.cpp

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_MY_COMMAND, OnMyCommand)
END_MESSAGE_MAP()

BOOL CMyView::OnInitDialog()
{
    m_menu = GetMenu();
}

void CMyView::OnMyCommand()
{
    m_Flag = !m_Flag; // Toggle the flag

    if (m_flag) {
        m_menu->CheckMenuItem(ID_MENUITEM, MF_CHECKED | MF_BYCOMMAND);
    } else {
        m_menu->CheckMenuItem(ID_MENUITEM, MF_UNCHECKED | MF_BYCOMMAND);
    }
}

المراجع:

http://www.codeguru.com/forum/showthread.php?t=322261

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top