MFC RibbonBar - 以编程方式最小化?
Posted
技术标签:
【中文标题】MFC RibbonBar - 以编程方式最小化?【英文标题】:MFC RibbonBar -- programmatically minimize? 【发布时间】:2012-08-06 11:59:13 【问题描述】:MFC 功能区栏有一个标有“最小化功能区”的菜单项。选择它时,仅显示每个类别的标题,单击标题时会弹出功能区。我想以编程方式强制功能区进入这种状态。不幸的是,我能找到的唯一方法是ToggleMimimizeState()
[原文如此],它会根据当前状态将其置于此状态或将其取出。
看MFC源码,菜单命令的工作方式是通过这段代码:
case idMinimize:
if (m_pActiveCategory != NULL)
ASSERT_VALID(m_pActiveCategory);
m_pActiveCategory->ShowElements(FALSE);
RedrawWindow();
m_pActiveCategory
可以通过GetActiveCategory()
方法从CMFCRibbonBar
类的外部获取,但不幸的是该类别的ShowElements()
方法是protected
,我看不到与公众达到相同效果的方法方法。
似乎也没有一种明显的方法来确定功能区当前是否最小化。
是我遗漏了什么,还是我只需要猜测当前状态?
【问题讨论】:
【参考方案1】:从 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);
希望对你有帮助。
【讨论】:
不可接受! GetActiveCategory() 实际上并不指向 MyCMFCRibbonCategory 类型对象的子对象。强制转换会导致未定义的行为(参见 C++ 标准 5.2.9)。 好吧,标准方法要求必须在向下转换为之前创建 MyCMFCRibbonCategory 的实例(或从它派生的类)。但是,我建议尽可能避免强制转换,并且永远不要使用 C 风格的强制转换。在这种情况下,您可以创建 MyCMFCRibbonCategory 的实例并调用“CopyFrom”,您可以在其中提供活动类别作为参数。然后你就可以放心地调用“force_ShowElements”了。【参考方案2】:以上的组合对我有用。也就是说,我想将功能区用作主菜单上的一组选项卡式附加功能。但是,我不希望功能区能够保持最大化。我只希望用户单击,查看一些操作,然后消失。
简而言之,防止功能区停靠或保持最大化。不管你想怎么称呼它。单击选项卡,然后单击功能区上的图标并消失。
说明:
-
我通过继承 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;
【讨论】:
【参考方案3】:使用 m_wndRibbonBar.ToggleMimimizeState();
【讨论】:
【参考方案4】:只需检查 (m_wndRibbonBar.GetHideFlags() & AFX_RIBBONBAR_HIDE_ELEMENTS) 值。
【讨论】:
以上是关于MFC RibbonBar - 以编程方式最小化?的主要内容,如果未能解决你的问题,请参考以下文章
VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)
(转载)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)
VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)