MFC RibbonBar - 以编程方式最小化?

时间:2012-08-06 11:59:13

标签: mfc ribbon

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

查看MFC源代码,菜单命令的工作方式是通过以下代码:

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

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

似乎没有明显的方法来确定色带当前是否已最小化。

是否有我遗漏的东西,或者我只是猜测目前的状态?

4 个答案:

答案 0 :(得分:3)

CMFCRibbonBar CMFCRibbonCategory

中获取两个新类
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);
}

希望它可以提供帮助。

答案 1 :(得分:1)

以上的组合对我有用。也就是说,我想在主菜单上使用功能区作为标签集的附加功能。但是,我并不希望功能区能够保持最大化。我只希望用户点击,看到一些动作,然后消失。

简而言之,防止色带对接或保持最大化。无论你想叫什么。单击选项卡,然后单击功能区上的图标并消失。

说明:

  1. 我通过继承CMFCRibbonBar来获得自己的CMyRibbon类。 (使用类向导完成并制作MFC类)
  2. 在我们新的CMyRibbon类(ClassWizard)中为WM_SIZE创建一个事件处理程序
  3. 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;

答案 2 :(得分:0)

使用m_wndRibbonBar.ToggleMimimizeState();

答案 3 :(得分:-1)

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