微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有更简单的方法来确定没有菜单项设置为 MF_CHECKED

如何解决有没有更简单的方法来确定没有菜单项设置为 MF_CHECKED

我的代码本身运行正常,我想知道是否有一种更简单的方法来确定是否至少我的一个菜单项被检查


上下文

菜单正被 CMFcmenuButton 使用,如下所示:

Menu

行为

菜单本质上是一组选中菜单项,用户可以根据需要切换。然后应用程序根据这些菜单项的状态执行一些操作。基本的东西。

目前我有这个代码片段(工作正常):

MSAToolsLibrary::IPublisherPtr pPublisher = nullptr;

if (theApp.MSAToolsInterface().GetPublisher(aryStrNames[i],pPublisher))
{
    bool bAdd = false;

    MSAToolsLibrary::Serving eServing;
    MSAToolsLibrary::Appointed eAppointed;

    pPublisher->get_ServingAs(&eServing);
    pPublisher->get_AppointedAs(&eAppointed);

    bool bNoExtraPublisherFilter = true;
    if (m_menuExtraPublisherFilter.GetMenuState(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_UNBAPTISED_PUBLISHER,MF_BYCOMMAND) == MF_CHECKED)
    {
        bNoExtraPublisherFilter = false;
        if (eServing == MSAToolsLibrary::Serving_UnbaptisedPublisher)
            bAdd = true;
    }
    if (m_menuExtraPublisherFilter.GetMenuState(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_PUBLISHER,MF_BYCOMMAND) == MF_CHECKED)
    {
        bNoExtraPublisherFilter = false;
        if (eServing == MSAToolsLibrary::Serving_Publisher)
            bAdd = true;
    }
    if (m_menuExtraPublisherFilter.GetMenuState(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_REGULAR_PIONEER,MF_BYCOMMAND) == MF_CHECKED)
    {
        bNoExtraPublisherFilter = false;
        if (eServing == MSAToolsLibrary::Serving_RegularPioneer)
            bAdd = true;
    }
    if (m_menuExtraPublisherFilter.GetMenuState(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_OTHER,MF_BYCOMMAND) == MF_CHECKED)
    {
        bNoExtraPublisherFilter = false;
        if (eServing == MSAToolsLibrary::Serving_Other)
            bAdd = true;
    }
    if (m_menuExtraPublisherFilter.GetMenuState(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_NOT_APPOINTED,MF_BYCOMMAND) == MF_CHECKED)
    {
        bNoExtraPublisherFilter = false;
        if (eAppointed == MSAToolsLibrary::Appointed_NotAppointed)
            bAdd = true;
    }
    if (m_menuExtraPublisherFilter.GetMenuState(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_MINISTERIAL_SERVANT,MF_BYCOMMAND) == MF_CHECKED)
    {
        bNoExtraPublisherFilter = false;
        if (eAppointed == MSAToolsLibrary::Appointed_MinisterialServant)
            bAdd = true;
    }
    if (m_menuExtraPublisherFilter.GetMenuState(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_ELDER,MF_BYCOMMAND) == MF_CHECKED)
    {
        bNoExtraPublisherFilter = false;
        if (eAppointed == MSAToolsLibrary::Appointed_Elder)
            bAdd = true;
    }

    if(bNoExtraPublisherFilter)
    {
        // None of the menu items were checked
        bAdd = true;
    }

    if(bAdd)
        m_lbPublishers.AddString(aryStrNames[i]);
}

我只是想知道是否有更快的方法来查看是否没有将菜单项设置为 MF_CHECKED?因为如果可以检测到这种情况,我可以一起绕过 GetPublisher 代码并将它们添加到列表中。

我意识到我可以在一个返回 if 的专用函数中重复我现有的 bool 语句并这样做,但有没有更简单的方法


更新

菜单项的资源 ID 值是按顺序排列的,如下所示:

#define ID_PUBLISHERS_DATABASE_EXTRA_FILTER_PUBLISHER            35389
#define ID_PUBLISHERS_DATABASE_EXTRA_FILTER_REGULAR_PIONEER      35390
#define ID_PUBLISHERS_DATABASE_EXTRA_FILTER_NOT_APPOINTED        35391
#define ID_PUBLISHERS_DATABASE_EXTRA_FILTER_MINISTERIAL_SERVANT  35392
#define ID_PUBLISHERS_DATABASE_EXTRA_FILTER_ELDER                35393
#define ID_PUBLISHERS_DATABASE_EXTRA_FILTER_UNBAPTISED_PUBLISHER 35394
#define ID_PUBLISHERS_DATABASE_EXTRA_FILTER_OTHER                35395

但是菜单中确实有一个分隔符。


宏问题

我想我会在一个测试项目中尝试宏观的想法。我在头文件中插入了这个宏:

#define PROCESSFILTER(id,cond) \
        if (m_menuExtraPublisherFilter.GetMenuState(id,MF_BYCOMMAND) == MF_CHECKED) \
        { \
          bNoExtraPublisherFilter = false; \
          if (cond) \
            bAdd = true; \
        }

添加m_menuExtraPublisherFilter 作为 cmenuCDiialogEx 成员变量。然后我创建了虚拟资源 ID ID_TEST 只是使用了标准条件,因为我无法访问演示中的工具库。在 OnInitDialog 我试过:

PROCESSFILTER(ID_TEST,5 > 4);

但是它崩溃了。为什么?

enter image description here

解决方法

根据评论中的建议,我最终创建了一个添加到头文件中的宏:

#define PROCESSFILTER(id,cond) \
        if (m_menuExtraPublisherFilter.GetMenuState(id,MF_BYCOMMAND) == MF_CHECKED) \
        { \
          bNoExtraPublisherFilter = false; \
          if (cond) \
            bAdd = true; \
        }

我将源代码简化为:

MSAToolsLibrary::IPublisherPtr pPublisher = nullptr;

if (theApp.MSAToolsInterface().GetPublisher(aryStrNames[i],pPublisher))
{
    bool bAdd = false;

    MSAToolsLibrary::Serving eServing;
    MSAToolsLibrary::Appointed eAppointed;

    pPublisher->get_ServingAs(&eServing);
    pPublisher->get_AppointedAs(&eAppointed);

    bool bNoExtraPublisherFilter = true;

    PROCESSFILTER(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_UNBAPTISED_PUBLISHER,eServing == MSAToolsLibrary::Serving_UnbaptisedPublisher);
    PROCESSFILTER(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_PUBLISHER,eServing == MSAToolsLibrary::Serving_Publisher);
    PROCESSFILTER(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_REGULAR_PIONEER,eServing == MSAToolsLibrary::Serving_RegularPioneer);
    PROCESSFILTER(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_OTHER,eServing == MSAToolsLibrary::Serving_Other);
    PROCESSFILTER(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_NOT_APPOINTED,eAppointed == MSAToolsLibrary::Appointed_NotAppointed);
    PROCESSFILTER(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_MINISTERIAL_SERVANT,eAppointed == MSAToolsLibrary::Appointed_MinisterialServant);
    PROCESSFILTER(ID_PUBLISHERS_DATABASE_EXTRA_FILTER_ELDER,eAppointed == MSAToolsLibrary::Appointed_Elder);

    if(bNoExtraPublisherFilter)
    {
        // None of the menu items were checked
        bAdd = true;
    }

    if(bAdd)
        m_lbPublishers.AddString(aryStrNames[i]);
}

我必须确保的一件事是在执行宏之前构建了 CSplitButton 菜单。否则会因菜单句柄无效而引发异常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。