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】:

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

希望对你有帮助。

【讨论】:

不可接受! 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界面开发:使用更多控件并为控件添加消息处理函数)

MFC:更新 Ribbon Bar 元素以反映操作进度

如何使用 MFC 以编程方式更改 ActiveX 控件的属性?

使用 MFC 以编程方式更改文件扩展名关联?