0

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

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

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

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

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

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

4

4 回答 4

3

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

希望它可以提供帮助。

于 2012-08-07T21:17:07.490 回答
1

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

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

指示:

  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;
于 2015-08-12T19:12:09.480 回答
0

使用 m_wndRibbonBar.ToggleMimimizeState();

于 2014-06-19T07:36:07.607 回答
-1

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

于 2014-11-06T16:01:31.150 回答