【问题标题】:MFC RibbonBar -- programmatically minimize?MFC RibbonBar - 以编程方式最小化?
【发布时间】:2012-08-06 11:59:13
【问题描述】:

MFC 功能区栏有一个标有“最小化功能区”的菜单项。选择它时,仅显示每个类别的标题,单击标题时会弹出功能区。我想以编程方式强制功能区进入这种状态。不幸的是,我能找到的唯一方法是ToggleMimimizeState() [原文如此],它会根据当前状态将其置于此状态或将其取出。

看MFC源码,菜单命令的工作方式是通过这段代码:

case idMinimize:
    if (m_pActiveCategory != NULL)
    {
        ASSERT_VALID(m_pActiveCategory);
        m_pActiveCategory->ShowElements(FALSE);
        RedrawWindow();
    }

m_pActiveCategory 可以通过GetActiveCategory() 方法从CMFCRibbonBar 类的外部获取,但不幸的是该类别的ShowElements() 方法是protected,我看不到与公众达到相同效果的方法方法。

似乎也没有一种明显的方法来确定功能区当前是否最小化。

是我遗漏了什么,还是我只需要猜测当前状态?

【问题讨论】:

    标签: mfc ribbon


    【解决方案1】:

    CMFCRibbonBarCMFCRibbonCategory

    派生两个新类
    class MyCMFCRibbonCategory: public CMFCRibbonCategory
    {
    public:
        void force_ShowElements(BOOL todo)
        {
            ShowElements(todo);
        }
    };
    
    class MyRibbonBar: public CMFCRibbonBar
    {
    public:
        BOOL is_minimized()
        {
            return m_dwHideFlags == AFX_RIBBONBAR_HIDE_ELEMENTS;
        }
    
        void minimize_me(BOOL show_minimized)
        {
            MyCMFCRibbonCategory* cc = (MyCMFCRibbonCategory*)GetActiveCategory();
            if (cc != NULL)
            {
                cc->force_ShowElements(!show_minimized);
                RedrawWindow();
            }
        }
    };
    

    然后从

    更改您的 CMainframe
    CMFCRibbonBar   m_wndRibbonBar;
    

    MyRibbonBar     m_wndRibbonBar;
    

    现在您可以在您的代码中使用新的两个成员:

    BOOL MyRibbonBar::is_minimized()
    void MyRibbonBar::minimize_me(BOOL show_minimized)
    

    基本示例:

    void CMainFrame::OnButton2()
    {
        if( m_wndRibbonBar.is_minimized() )
            m_wndRibbonBar.minimize_me(FALSE);
        else
            m_wndRibbonBar.minimize_me(TRUE);
    }
    

    希望对你有帮助。

    【讨论】:

    • 不可接受! GetActiveCategory() 实际上并不指向 MyCMFCRibbonCategory 类型对象的子对象。强制转换会导致未定义的行为(参见 C++ 标准 5.2.9)。
    • 好吧,标准方法要求必须在向下转换为之前创建 MyCMFCRibbonCategory 的实例(或从它派生的类)。但是,我建议尽可能避免强制转换,并且永远不要使用 C 风格的强制转换。在这种情况下,您可以创建 MyCMFCRibbonCategory 的实例并调用“CopyFrom”,您可以在其中提供活动类别作为参数。然后你就可以放心地调用“force_ShowElements”了。
    【解决方案2】:

    以上的组合对我有用。也就是说,我想将功能区用作主菜单上的一组选项卡式附加功能。但是,我不希望功能区能够保持最大化。我只希望用户单击,查看一些操作,然后消失。

    简而言之,防止功能区停靠或保持最大化。不管你想怎么称呼它。单击选项卡,然后单击功能区上的图标并消失。

    说明:

    1. 我通过继承 CMFCRibbonBar 派生了我自己的 CMyRibbon 类。 (使用类向导完成并制作 MFC 类)
    2. 在我们的新 CMyRibbon 类 (ClassWizard) 中为 WM_SIZE 创建一个事件处理程序

    void CMyRibbon::OnSize(UINT nType, int cx, int cy)
    {
        CMFCRibbonBar::OnSize(nType, cx, cy);
    
        if (!(GetHideFlags() & AFX_RIBBONBAR_HIDE_ELEMENTS))
            ToggleMimimizeState();
    }
    
    1. 在 CMainFrm.h 中添加以下更改: CMyRibbon m_wndRibbonBar;

    【讨论】:

      【解决方案3】:

      使用 m_wndRibbonBar.ToggleMimimizeState();

      【讨论】:

        【解决方案4】:

        只需检查 (m_wndRibbonBar.GetHideFlags() & AFX_RIBBONBAR_HIDE_ELEMENTS) 值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 2017-04-17
          • 2010-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多