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



MFC功能区栏有一个名为"最小化功能区"的菜单项。选择它时,只显示每个类别的标题,单击标题时会弹出功能区。我想以编程方式强制功能区进入此状态。不幸的是,我能找到的唯一方法是ToggleMimimizeState()[sic],它要么将其放入这种状态,要么根据其当前状态将其取出。

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

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

m_pActiveCategory可以通过GetActiveCategory()方法从CMFCRibbonBar类之外获得,但不幸的是,该类别的ShowElements()方法是protected,我看不到与公共方法实现相同效果的方法。

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

是我遗漏了什么,还是我只能猜测目前的状态?

CMFCRibbonBarCMFCRibonCategory派生两个新类

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);
}

希望能有所帮助。

以上功能的组合对我很有效。也就是说,我想将Ribbon用作主菜单上的一组选项卡式附加功能。然而,我不希望缎带能够保持最大化。我只想让用户点击,看到一些动作,然后消失。

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

说明:

  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

使用m_wndRibbonBar.ToggleMimizeState();

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

最新更新