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
,我看不到与公共方法实现相同效果的方法。
似乎也没有明显的方法来确定功能区当前是否最小化。
是我遗漏了什么,还是我只能猜测目前的状态?
从CMFCRibbonBar和CMFCRibonCategory派生两个新类
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用作主菜单上的一组选项卡式附加功能。然而,我不希望缎带能够保持最大化。我只想让用户点击,看到一些动作,然后消失。
简而言之,防止功能区停靠或保持最大化。随便你怎么称呼它。单击一个选项卡,然后单击功能区上的图标,然后消失。
说明:
- 我通过继承CMFCRibbonBar派生了自己的CMyRibbon类。(使用类向导并生成MFC类完成)
- 在我们新的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();
}
- 在CMainFrm.h中添加此更改:CMyRibbon m_wndRibbonBar
使用m_wndRibbonBar.ToggleMimizeState();
只需检查(m_wndRibbonBar.GetHideFlags()&AFX_RIBBONBAR_HIDE_ELEMENTS)值。