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
,我看不到用公共方法达到同样效果的方法。
似乎没有明显的方法来确定色带当前是否已最小化。
是否有我遗漏的东西,或者我只是猜测目前的状态?
答案 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();
}
}
};
然后从
更改您的CMainframeCMFCRibbonBar 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)
以上的组合对我有用。也就是说,我想在主菜单上使用功能区作为标签集的附加功能。但是,我并不希望功能区能够保持最大化。我只希望用户点击,看到一些动作,然后消失。
简而言之,防止色带对接或保持最大化。无论你想叫什么。单击选项卡,然后单击功能区上的图标并消失。
说明:
void CMyRibbon::OnSize(UINT nType, int cx, int cy)
{
CMFCRibbonBar::OnSize(nType, cx, cy);
if (!(GetHideFlags() & AFX_RIBBONBAR_HIDE_ELEMENTS))
ToggleMimimizeState();
}
答案 2 :(得分:0)
使用m_wndRibbonBar.ToggleMimimizeState();
答案 3 :(得分:-1)
只需检查(m_wndRibbonBar.GetHideFlags()& AFX_RIBBONBAR_HIDE_ELEMENTS)值。