MFC有关Ribbon控件的使用

MFC有关Ribbon控件的使用

在软件开发过程中看到别人开发的软件可以向Office那样,菜单项下面有一块面板,面板里面有各种按钮功能。例如WPS也要类似的接界面,于是想着学习一下如何开发。

微信截图_20231122235747!](C:\Users\Administrator\Desktop\微信截图_20231122235747.png)

使用科大星火讯飞星火大模型的回答,有关于Ribbon控件的介绍:

Ribbon控件在MFC中是一种现代化的用户界面,它类似于Office 2007的样式,可以替代传统的MFC程序里的菜单和工具栏。默认生成的Ribbon功能较少,需要开发者自行添加一些控件和图片等元素以提升界面的美观度和易用性。

Ribbon控件的主要作用包括:

  • 提供一个更加直观、易用的界面,使用户能够更容易地找到和使用功能;
  • 提供一种灵活的布局方式,使得开发人员可以根据需要自由地组织和排列控件;
  • 支持多种不同的控件类型,如按钮、文本框、下拉菜单等,以满足各种应用程序的需求;
  • 允许开发人员通过编程方式来操作和控制Ribbon控件,从而使得应用程序更加强大和灵活。有关Ribbon控件的介绍可以参考Ribbon控件

以下是C#中有关于Ribbon控件的介绍:

1.Ribbon 要素

1.在视觉上,Ribbon 控件由两个区域组成:

  • 命令区(Command Region) —— 显示不同的组合在 Groups(组)Pages(页面) 中的命令。
  • 快速访问工具栏(Quick Access Toolbar) —— 显示了经常使用的命令。 在运行时刻最终用户可以把命令添加到快速访问工具栏中。

Ribbon 控件的主要元素在下图中显示:

img

2.Ribbon 布局

Ribbon 控件提供了巧妙的布局,能最大限度地使用可用的空间来尽可能多地显示多种信息 (links、标题等)。 例如,如果一个页面组被拉伸并且没有位置来显示所有可用的 links,则它自动变成一个可以在下拉面板中显示子项的下拉按钮 (请参阅下面的插图)。

img

不能定制 ribbon 的布局。 意思是不允许最终用户添加、移除、替换 ribbon 元素等。 唯一能定制的元素是 快速访问工具栏。 它显示重要的和最常用的命令 (item links),并且允许最终用户定制这些命令的列表 (添加、移除等)。 要获得更多信息,请参阅 快速访问工具栏

3.Ribbon 的外观

Ribbon 控件 被使用皮肤绘制。 不支持其他绘制样式,例如 Flat、Style3D、WindowsXP。

img

Ribbon 控件 的外观由 Bar 和 Docking 控制器 控制。 在默认情况下,Ribbon 控件的 RibbonControl.Controller 属性值设置为 null。 意思是它使用由 DefaultBarAndDockingController 提供的默认外观设置。 这表示一个可以通过 BarAndDockingController.Default 属性或 DefaultBarAndDockingController 组件进行访问的静态对象。

要提供自定义的外观与感觉设置,则把 BarAndDockingController 组件拖放到窗体中,把它指派到 Ribbon 控件的 RibbonControl.Controller 属性,并且选择所需的皮肤主题。 也可以使用相应的由 BarAndDockingController.AppearancesRibbon 属性提供的外观属性来定制 ribbon 元素的字体设置。

Ribbon 控件使用的实际的控制器可以通过 RibbonControl.GetController 方法获取。

MFC中有关Ribbon控件的介绍可以参考:MFC - Ribbon学习

下面我们使用VS2022新建一个Ribbon控件的程序:

创建Ribbon风格工具栏

  1. 创建MFC项目,省略创建过程。注意,选择“使用功能区”(Ribbon分格工具栏)。

在这里插入图片描述

  1. Ribbon工具栏的特点
    Ribbon工具栏就是一个窗口,可以用窗口工具进行添加控件(类似于对话框工具);
    控件的从属关系如下:
  • Ribbon工具栏
    • 类别
      • 面板
        • 其他控件(按钮、标签、编辑…)

新建工程中的Ribbon工具栏如下图:

Snipaste_2023-11-25_19-03-40!](C:\Users\Administrator\Desktop\Snipaste_2023-11-25_19-03-40.png)

今天我们要在单文档的程序中添加代码是程序具有Ribbon风格.其中微软官方有一个例子:[RibbonGadgets](VC2010Samples/MFC/Visual C++ 2008 Feature Pack/RibbonGadgets),其中微软官方还有很多的例子大家下载都可以使用地址是:Visual Stdio 中C++例子

我们今天要用的例子是RibbonGadgets.其中的界面这样子的:

Snipaste_2023-11-25_19-16-04

该项目中重要的代码如下:

1.定义一个类CMFCVisualManagerDeviant继承自CMFCVisualManagerOffice2007,使应用程序具有office2007的外观。

#include <afxvisualmanageroffice2007.h>
class CMFCVisualManagerDeviant :public CMFCVisualManagerOffice2007
{
	DECLARE_DYNCREATE(CMFCVisualManagerDeviant)
public:
	CMFCVisualManagerDeviant();
	virtual ~CMFCVisualManagerDeviant();

	virtual COLORREF OnDrawRibboPanel(CDC* pDC,CMFCRibbonPanel* pPanel,CRect rcPanel,CRect rcCapton);
	virtual void OnDrawRibbonCategory(CDC* pDC,CMFCRibbonCategory* pCategory,CRect rcCategory);
	virtual void OnFillBarBackground(CDC* pDC,CBasePane* pBar,CRect rcClient,CRect rcClip,BOOL bNCArc = FALSE);

	virtual COLORREF OnDrawRibbonCategoryTab(CDC* pDC,CMFCRibbonTab* pTab,BOOL bIsActive);
	void OnDrawRibbonDefaultPaneButton(CDC* pDC,CMFCRibbonButton* pButton);
	COLORREF OnFillRibbonButton(CDC* pDC,CMFCRibbonButton* pButton);

	COLORREF OnDrawMenuLabel(CDC* pDC,CRect rect);

	COLORREF GetClrRibbonPanelBkBottom() const { return m_clrRibbonPanelBkBottom; };
	void SetClrRibbonPanelBkBottom(COLORREF color) { m_clrRibbonPanelBkBottom = color;};

	COLORREF GetClrRibbonPanelBkTop() const { return m_clrRibbonPanelBkTop; };
	void SetClrRibbonPanelBkTop(COLORREF color) { m_clrRibbonPanelBkTop = color; };

	COLORREF GetClrRibbonPanelTextPB() const { return m_clrRibbonPanelTextPB; };
	void SetClrRibbonPanelTextPB(COLORREF color) { m_clrRibbonPanelTextPB = color; };

	COLORREF GetClrRibbonPanelCaptionTextPB() const { return m_clrRibbonPanelCaptionTextPB; };
	void SetClrRibbonPanelCaptionTextPB(COLORREF color) { m_clrRibbonPanelCaptionTextPB = color; };

	COLORREF GetClrRibbonPanelCaptionTextHighlightedPB() const { return m_clrRibbonPanelCaptionTextHighlightedPB; };
	void SetClrRibbonPanelCaptionTextHighlightedPB(COLORREF color) { m_clrRibbonPanelCaptionTextHighlightedPB = color; };

	COLORREF GetClrRibbonBarBackground() const { return m_clrRibbonBarBackground; };
	void SetClrRibbonBarBackground(COLORREF color) { m_clrRibbonBarBackground = color; };

	COLORREF GetClrRibbonBarTextPB() const { return m_clrRibbonBarTextPB; };
	void SetClrRibbonBarTextPB(COLORREF color) { m_clrRibbonBarTextPB = color; };

	COLORREF GetClrRibbonBarTextHighlightedPB() const { return m_clrRibbonBarTextHighlightedPB; };
	void SetClrRibbonBarTextHighlightedPB(COLORREF color) { m_clrRibbonBarTextHighlightedPB = color; };

	COLORREF GetClrRibbonCategoryBkBottom() const { return m_clrRibbonCaregoryBkBottom; };
	void SetClrRibbonCategoryBkBottom(COLORREF color) { m_clrRibbonCaregoryBkBottom = color; };

	COLORREF GetClrRibbonCategoryBkTop() const { return m_clrRibbonCaregoryBkTop; };
	void SetClrRibbonCategoryBkTop(COLORREF color) { m_clrRibbonCaregoryBkTop = color; };

	COLORREF GetClrRibbonPanelOutline() const { return m_clrRibbonPanelOutLine; };
	void SetClrRibbonPanelOutLine(COLORREF color) { m_clrRibbonPanelOutLine = color; };

	COLORREF GetClrRibbonPanelCaptionBk() const { return m_clrRibbonPanelCaptionBk; };
	void SetClrRibbonPanelCaptionBk(COLORREF color) { m_clrRibbonPanelCaptionBk = color; };

	virtual BOOL OnEraseMDIClientArea(CDC* pDC,CRect rcClient);
	COLORREF GetClrMDIClientArea() const { return m_clrMDIClientArea; };
	void SetClrMDIClientArea(COLORREF color) { m_clrMDIClientArea = color; };

	BOOL GetCustomMDIClientAreaClr() const { return m_bCustomMDIClientAreaClr; };
	void SetCustomMDIClientAreaClr(BOOL bCus) { m_bCustomMDIClientAreaClr = bCus; };

protected:
	// Utility fns to Lighten or darken colour
	COLORREF LightenColor(long nScale, COLORREF lColor);
	COLORREF DrakenColor(long nScale, COLORREF lColor);

	// Ribbon panel colours
	COLORREF m_clrRibbonPanelBkBottom;
	COLORREF m_clrRibbonPanelBkTop;
	COLORREF m_clrRibbonPanelCaptionBk;
	COLORREF m_clrRibbonPanelTextPB;
	COLORREF m_clrRibbonPanelCaptionTextPB;
	COLORREF m_clrRibbonPanelCaptionTextHighlightedPB;
	COLORREF m_clrRibbonPanelOutLine;

	// Ribbon category colours 
	COLORREF m_clrRibbonCaregoryBkBottom;
	COLORREF m_clrRibbonCaregoryBkTop;

	// Ribbon Menu bar background
	COLORREF m_clrRibbonBarBackground;
	COLORREF m_clrRibbonBarTextPB;
	COLORREF m_clrRibbonBarTextHighlightedPB;

	// MDI background colours
	BOOL m_bCustomMDIClientAreaClr;
	COLORREF m_clrMDIClientArea;

};

该类的实现:

#include "pch.h"
#include "CMFCVisualManagerDeviant.h"

IMPLEMENT_DYNCREATE(CMFCVisualManagerDeviant, CMFCVisualManagerOffice2007)

CMFCVisualManagerDeviant::CMFCVisualManagerDeviant()
    :CMFCVisualManagerOffice2007()
    ,m_clrRibbonPanelBkBottom(RGB(255,255,255))
    ,m_clrRibbonPanelBkTop(RGB(255,214,51))
    ,m_clrRibbonPanelCaptionBk(m_clrRibbonPanelBkTop)
    ,m_clrRibbonPanelTextPB(RGB(204,0,51))
    ,m_clrRibbonPanelCaptionTextPB(RGB(102,51,204))
    ,m_clrRibbonPanelCaptionTextHighlightedPB(RGB(0,0,0))
    ,m_clrRibbonCaregoryBkBottom(RGB(255,255,255))
    ,m_clrRibbonCaregoryBkTop(RGB(255,244,204))
    ,m_clrRibbonBarBackground(RGB(204,0,51))
    , m_clrRibbonPanelOutLine(RGB(192,192,192))
    , m_clrRibbonBarTextPB(RGB(255,255,255))
    , m_clrRibbonBarTextHighlightedPB(RGB(64,64,255))
    , m_bCustomMDIClientAreaClr(FALSE)
{

}

CMFCVisualManagerDeviant::~CMFCVisualManagerDeviant()
{

}

COLORREF CMFCVisualManagerDeviant::OnDrawRibboPanel(CDC* pDC, CMFCRibbonPanel* pPanel, CRect rcPanel, CRect rcCapton)
{
    if (!pPanel->IsCollapsed())
    {
        rcPanel.top += 1;
        rcPanel.right -= 1;
        rcPanel.left += 1;
        CDrawingManager dm(*pDC);
        dm.FillGradient2(rcPanel, m_clrRibbonPanelBkBottom, m_clrRibbonPanelBkTop,90);

        CRect rectPanelBottom;
        rectPanelBottom.top = rectPanelBottom.bottom - (rectPanelBottom.Height() * 2);
        rectPanelBottom.bottom -= 1;
        dm.FillGradient2(rectPanelBottom, m_clrRibbonPanelCaptionBk, m_clrRibbonPanelCaptionBk,90);

        
        rcPanel.right += 1;
        rcPanel.left -= 1;
        rcPanel.top -= 1;

        CPen mypen(PS_SOLID,1, m_clrRibbonPanelOutLine);
        CPen* pOldPen = pDC->SelectObject(&mypen);
        CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
        pDC->RoundRect(rcPanel,CPoint(5,5));
        pDC->SelectObject(pOldPen);
        pDC->SelectObject(pOldBrush);

        m_clrRibbonPanelCaptionText = m_clrRibbonPanelCaptionTextPB;
        m_clrRibbonPanelCaptionTextHighlighted = m_clrRibbonPanelCaptionTextHighlightedPB;

    }

    return m_clrRibbonPanelTextPB;
}

void CMFCVisualManagerDeviant::OnDrawRibbonCategory(CDC* pDC, CMFCRibbonCategory* pCategory, CRect rcCategory)
{
    CDrawingManager dm(*pDC);
    dm.FillGradient2(rcCategory, m_clrRibbonCaregoryBkBottom, m_clrRibbonCaregoryBkTop,90);
}

void CMFCVisualManagerDeviant::OnFillBarBackground(CDC* pDC, CBasePane* pBar, CRect rcClient, CRect rcClip, BOOL bNCArc)
{
    CBrush br(m_clrRibbonBarBackground);
    pDC->FillRect(rcClient,&br);
}

COLORREF CMFCVisualManagerDeviant::OnDrawRibbonCategoryTab(CDC* pDC, CMFCRibbonTab* pTab, BOOL bIsActive)
{
    if (!CanDrawImage())
    {
        return CMFCVisualManagerOffice2003::OnDrawRibbonCategoryTab(pDC, pTab, bIsActive);
    }

    ASSERT_VALID(pDC);
    ASSERT_VALID(pTab);

    CMFCRibbonCategory* pCategory = pTab->GetParentCategory();
    ASSERT_VALID(pCategory);
    CMFCRibbonBar* pBar = pCategory->GetParentRibbonBar();
    ASSERT_VALID(pBar);

    bIsActive = bIsActive & ((pBar->GetHideFlags() & AFX_RIBBONBAR_HIDE_ELEMENTS) == 0 || pTab->GetDroppedDown() != NULL);
    const BOOL bPressed = pTab->IsPressed();
    const BOOL bFocused = (pTab->IsFocused()) && (pBar->GetHideFlags() & AFX_RIBBONBAR_HIDE_ELEMENTS);
    const BOOL bHighLight = (pTab->IsHighlighted() || bFocused) && (!pTab->GetDroppedDown());


    COLORREF clrText = GetClrRibbonBarTextPB();
    COLORREF clrTextHighlighted = m_clrRibbonBarTextHighlightedPB;

    CRect rectTab = pCategory->GetTabRect();

    TRACE(_T("\nDrawing tab '%s'. Active=%d, Pressed=%d, Focused=%d, Highlighted=%d"), pCategory->GetName(), bIsActive, bPressed, bFocused, bHighLight);

    if (pCategory->IsActive())
    {
        CDrawingManager dm(*pDC);
        dm.FillGradient2(rectTab, m_clrRibbonPanelBkBottom, m_clrRibbonPanelBkTop,90);
    }
    else
    {
        CBrush br(m_clrRibbonBarBackground);
        pDC->FillRect(rectTab,&br);
    }
    
    return bIsActive ? clrTextHighlighted : clrText;
}

void CMFCVisualManagerDeviant::OnDrawRibbonDefaultPaneButton(CDC* pDC, CMFCRibbonButton* pButton)
{
    if (!CanDrawImage())
    {
        CMFCVisualManagerOffice2003::OnDrawRibbonDefaultPaneButton(pDC, pButton);
        return;
    }

    ASSERT(pDC);
    ASSERT(pButton);

    CRect rect(pButton->GetRect());
    CDrawingManager dm(*pDC);
    dm.FillGradient2(rect, m_clrRibbonPanelBkBottom, m_clrRibbonPanelBkTop,90);
    pDC->Draw3dRect(rect,RGB(192,192,192), RGB(192, 192, 192));

    BOOL bIsQATMode = pButton->IsQATMode();

    CRect rectFrame(pButton->GetRect());

    if (!bIsQATMode)
    {
        if (m_ctrlRibbonBtnDefaultIcon.IsValid())
        {
            const CSize sizeImage = pButton->GetImageSize(CMFCRibbonButton::RibbonImageSmall);
            const int nMarginX = 11;
            const int nMarginY = 10;

            rectFrame.top += nMarginY/2;
            rectFrame.bottom = rectFrame.top + sizeImage.cy + nMarginY;
            rectFrame.top -= 2;
            rectFrame.left = rectFrame.CenterPoint().x - sizeImage.cx/2 - nMarginX;
            rectFrame.right = rectFrame.left + sizeImage.cx + 2 * nMarginX;

            m_ctrlRibbonBtnDefaultIcon.Draw(pDC, rectFrame);
        }
    }
    else
    {
        if (m_ctrlRibbonBtnDefaultQAT.IsValid())
        {
            int nIndex = 0;
            if (pButton->IsDroppedDown())
            {
                nIndex = 2;
            }
            else if(pButton->IsPressed())
            {
                if (pButton->IsHighlighted())
                {
                    nIndex = 2;
                }
            }
            else if(pButton->IsHighlighted()|| pButton->IsFocused())
            {
                nIndex = 1;
            }

            m_ctrlRibbonBtnDefaultQATIcon.Draw(pDC, rectFrame, nIndex);
        }
    }

    OnDrawRibbonDefaultPaneButtonContext(pDC,pButton);
}

COLORREF CMFCVisualManagerDeviant::OnFillRibbonButton(CDC* pDC, CMFCRibbonButton* pButton)
{
    if (!CanDrawImage())
    {
        return CMFCVisualManagerOffice2003::OnFillRibbonButton(pDC, pButton);
    }

    ASSERT(pDC);
    ASSERT(pButton);

    const BOOL bIsMenuMode = pButton->IsMenuMode();
    CRect rect = pButton->GetRect();

    CMFCControlRenderer* pRenderer = NULL;
    CMFCVisualManagerBitmapCache* pCache = NULL;
    int nIndex = 0;

    BOOL bDisabled = pButton->IsDisabled();
    BOOL bFocused = pButton->IsFocused();
    BOOL bDroppedDown = pButton->IsDroppedDown();
    BOOL bPressed = pButton->IsPressed() && (!bIsMenuMode);
    BOOL bChecked = pButton->IsChecked();
    BOOL bHighlighted = pButton->IsHighlighted() || bFocused;

    BOOL bDefaultPanelButton = pButton->IsDefaultPanelButton() && (!pButton->IsQATMode());

    if (bFocused)
    {
        bDisabled = FALSE;
    }

    if (pButton->IsDroppedDown() && (!bIsMenuMode))
    {
        bChecked = TRUE;
        bPressed = FALSE;
        bHighlighted = FALSE;
    }

    CMFCRibbonBaseElement::RibbonElementLocation location = pButton->GetLocationInGroup();

    if (pButton->IsKindOf(RUNTIME_CLASS(CMFCRibbonEdit)))
    {
        rect.left = pButton->GetCommandRect().left;

        COLORREF color1 = m_clrRibbonEdit;

        if (bDisabled)
        {
            color1 = m_clrRibbonEditDisabled;
        }
        else if(bChecked || bHighlighted)
        {
            color1 = m_clrEditBorderHighlighted;
        }

        COLORREF color2 = color1;

        {
            CDrawingManager dm(*pDC);
            dm.FillGradient(rect, color1, color2,TRUE);
        }

        return (COLORREF) - 1;
    }

    if (bChecked && bIsMenuMode && (!pButton->IsGalleryIcon()))
    {
        bChecked = FALSE;
    }

    if ((location != CMFCRibbonBaseElement::RibbonElementNotInGroup) && (pButton->IsShowGroupBorder()))
    {
        if (!pButton->GetMenuRect().IsRectEmpty())
        {
            CRect rectC = pButton->GetCommandRect();
            CRect rectM = pButton->GetMenuRect();

            CMFCControlRenderer* pRendererC = NULL;
            CMFCControlRenderer* pRendererM = NULL;

            CMFCVisualManagerBitmapCache* pCacheC = NULL;
            CMFCVisualManagerBitmapCache* pCacheM = NULL;

            if (location == CMFCRibbonBaseElement::RibbonElementSingleInGroup)
            {
                pRendererC = &m_ctrlRibbonBtnGroupMenu_F[0];
                pRendererM = &m_ctrlRibbonBtnGroupMenu_L[1];
                 
                pCacheC = &m_cacheRibbonBtnGroupMenu_F[0];
                pCacheM = &m_cacheRibbonBtnGroupMenu_L[1];

            }
            else if(location == CMFCRibbonBaseElement::RibbonElementFirstInGroup)
            {
                pRendererC = &m_ctrlRibbonBtnGroupMenu_F[0];
                pRendererM = &m_ctrlRibbonBtnGroupMenu_F[1];

                pCacheC = &m_cacheRibbonBtnGroupMenu_F[0];
                pCacheM = &m_cacheRibbonBtnGroupMenu_F[1];

            }
            else if (location == CMFCRibbonBaseElement::RibbonElementLastInGroup)
            {
                pRendererC = &m_ctrlRibbonBtnGroupMenu_L[0];
                pRendererM = &m_ctrlRibbonBtnGroupMenu_L[1];

                pCacheC = &m_cacheRibbonBtnGroupMenu_L[0];
                pCacheM = &m_cacheRibbonBtnGroupMenu_L[1];

            }
            else
            {
                pRendererC = &m_ctrlRibbonBtnGroupMenu_M[0];
                pRendererM = &m_ctrlRibbonBtnGroupMenu_M[1];

                pCacheC = &m_cacheRibbonBtnGroupMenu_M[0];
                pCacheM = &m_cacheRibbonBtnGroupMenu_M[1];
            }

            int nIndexC = 0;
            int nIndexM = 0;

            BOOL bHighlightedC = pButton->IsCommandAreaHighlighted();
            BOOL bHighlightedM = pButton->IsMenuAreaHighlighted();

            if (IsBeta())
            {
                if (bChecked)
                {
                    nIndexC = 3;
                }

                if (bDisabled)
                {
                    nIndexC = 0;
                }
                else 
                {
                    if (pButton->IsDroppedDown() && (!bIsMenuMode))
                    {
                        nIndexC = pButton->IsChecked() ? 3 : 0;
                        nIndexM = 3;
                    }
                    else
                    {
                        if (bPressed)
                        {
                            if (bHighlightedC)
                            {
                                nIndexM = 1;
                                nIndexC = 2;
                            }
                        }
                        else if(bHighlighted)
                        {
                            nIndexC++;
                            nIndexM = 1;
                        }
                    }
                }
            }
            else
            {
                if (bChecked)
                {
                    nIndexC = 3;

                    if (bHighlightedC)
                    {
                        nIndexC = 5;
                    }
                }

                if (bDisabled)
                {
                    if (bChecked)
                    {
                        nIndexC = 5;
                        nIndexM = 4;
                    }
                }
                else
                {
                    if (pButton->IsDroppedDown() && !bIsMenuMode)
                    {
                        nIndexC = pButton->IsChecked() ? 3 : 6;
                        nIndexM = 3;
                    }
                    else
                    {
                        if (bFocused)
                        {
                            nIndexC = 5;
                            nIndexM = 6;
                        }

                        if (bHighlightedC || bHighlightedM)
                        {
                            if (bChecked)
                            {
                                nIndexC = bHighlightedC ? 4 : 3;
                            }
                            else
                            {
                                nIndexC = bHighlightedC ? 1 : 6;
                            }

                            nIndexM = bHighlightedM ? 1 : 5;

                        }

                        if (bPressed)
                        {
                            if (bHighlightedC)
                            {
                                nIndexC = 2;
                            }
                        }
                    }
                }
            }
            if (nIndexC != -1 && nIndexM != -1)
            {
                int nCacheIndex = -1;
                if (pCacheC != NULL)
                {
                    CSize size(rectC.Size());

                    nCacheIndex = pCacheC->FindIndex(size);

                    if (nCacheIndex == -1)
                    {
                        nCacheIndex = pCacheC->Cache(size,*pRendererC);
                    }
                }

                if (nCacheIndex != -1)
                {
                    pCacheC->Get(nCacheIndex)->Draw(pDC,rectC,nIndexC);
                }
                else
                {
                    pRendererC->Draw(pDC, rectC, nIndexC);
                }

                nCacheIndex = -1;
                if (pCacheM != NULL)
                {
                    CSize size(rectM.Size());

                    nCacheIndex = pCacheM->FindIndex(size);

                    if (nCacheIndex == -1)
                    {
                        nCacheIndex = pCacheM->Cache(size, *pRendererM);
                    }
                }

                if (nCacheIndex != -1)
                {
                    pCacheM->Get(nCacheIndex)->Draw(pDC, rectM, nIndexM);
                }
                else
                {
                    pRendererM->Draw(pDC, rectM, nIndexM);
                }
            }
            return (COLORREF)-1;
        }
        else
        {
            if (location == CMFCRibbonBaseElement::RibbonElementSingleInGroup)
            {
                pRenderer = &m_ctrlRibbonBtnGroup_S;
                pCache = &m_cacheRibbonBtnGroup_S;
            }
            else if(location == CMFCRibbonBaseElement::RibbonElementFirstInGroup)
            {
                pRenderer = &m_ctrlRibbonBtnGroup_F;
                pCache = &m_cacheRibbonBtnGroup_F;
            }
            else if(location == CMFCRibbonBaseElement::RibbonElementLastInGroup)
            {
                pRenderer = &m_ctrlRibbonBtnGroup_L;
                pCache = &m_cacheRibbonBtnGroup_L;
            }
            else
            {
                pRenderer = &m_ctrlRibbonBtnGroup_M;
                pCache = &m_cacheRibbonBtnGroup_M;
            }

            if (bChecked)
            {
                nIndex = 3;
            }

            if (bDisabled && !bFocused)
            {
                nIndex = 0;
            }
            else
            {
                if (bPressed)
                {
                    if (bHighlighted)
                    {
                        nIndex = 2;
                    }
                }
                else if(bHighlighted)
                {
                    nIndex++;
                }
            }
        }
    }
    else if(bDefaultPanelButton)
    {
        if (bPressed)
        {
            if (bHighlighted)
            {
                nIndex = 2;
            }
        }
        else if(bHighlighted)
        {
            nIndex = 1;
        }
        else if (bChecked)
        {
            nIndex = 2;
        }

        if (bFocused && (!bDroppedDown) && m_ctrlRibbonBtnDefault.GetImageCount() > 3)
        {
            nIndex = 3;
        }

        if (nIndex != -1)
        {
            pRenderer = &m_ctrlRibbonBtnDefault;

            CMFCVisualManagerBitmapCache* pCacheDefault = &m_cacheRibbonBtnDefault;

            CMFCRibbonCategory* pCategory = pButton->GetParentCategory();
            ASSERT(pCategory);

            if (pCategory->GetTabColor() != AFX_CategoryColor_None)
            {
                CMFCRibbonContextCategory& Context = m_ctrlRibbonContextCategory[pCategory->GetTabColor()-1];

                pRenderer = &Context.m_ctrlBtnDefault;
                pCacheDefault = &Context.m_cacheBtnDefault;

            }

            const CMFCControlRendererInfo& Param = pRenderer->GetParams();

            int nCacheIndex = -1;

            if (pCacheDefault != NULL)
            {
                CSize size(Param.m_rectImage.Width(),rect.Height());
                nCacheIndex = pCacheDefault->FindIndex(size);
                if (nCacheIndex == -1)
                {
                    nCacheIndex = pCacheDefault->CacheY(size.cy, *pRenderer);
                }

                if (nCacheIndex == -1)
                {
                    pCacheDefault->Get(nCacheIndex)->DrawY(pDC,rect,CSize(Param.m_rectInter.left, Param.m_rectImage.right - Param.m_rectInter.right),nIndex);

                    return m_clrToolBarBtnTextHighlighted;
                }
            }
        }
    }
    else if((!bDisabled)&&(bPressed||bChecked||bHighlighted)|| (bDisabled && bFocused))
    {
        if (pButton->GetMenuRect().IsRectEmpty())
        {
            CRect rectC = pButton->GetCommandRect();
            CRect rectM = pButton->GetMenuRect();

            CMFCControlRenderer* pRendererC = pButton->IsMenuOnBottom() ? &m_ctrlRibbonBtnMenuV[0] : &m_ctrlRibbonBtnMenuH[0];
            CMFCControlRenderer* pRendererM = pButton->IsMenuOnBottom() ? &m_ctrlRibbonBtnMenuV[1] : &m_ctrlRibbonBtnMenuH[1];

            int nIndexC = -1;
            int nIndexM = -1;

            BOOL bDropped = pButton->IsDroppedDown();
            BOOL bHighlightedC = pButton->IsCommandAreaHighlighted();
            BOOL bHighlightedM = pButton->IsMenuAreaHighlighted();

            if (IsBeta())
            {
                if (bChecked)
                {
                    nIndexC = 2;
                }   nIndexM = 2;

                if (bDisabled)
                {
                    if (bChecked)
                    {

                    }
                }
                else 
                {
                    if (bDropped && !bIsMenuMode)
                    {
                        nIndexC = bChecked ? 2 : 4;
                        nIndexM = 2;
                    }
                    else
                    {
                        if (bPressed)
                        {
                            if(bHighlighted)
                            {
                                if (bHighlightedC)
                                {
                                    nIndexC = 1;
                                }
                                else
                                {
                                    nIndexC = bChecked ? nIndexC : 0;
                                }

                                nIndexM = bChecked ? nIndexM : 0;
                            }
                        }
                        else if (bHighlighted)
                        {
                            nIndexC++;
                            nIndexM++;
                        }
                    }
                }
            }
            else
            {
               
                if (bDisabled)
                {
                    if (bHighlightedC || bHighlightedM)
                    {
                        nIndexC = 4;
                        nIndexM = 4;
                    }

                    if (bHighlightedM)
                    {
                        nIndexM = 0;

                        if (bDropped && !bIsMenuMode)
                        {
                            nIndexC = 5;
                            nIndexM = 2;
                        }
                        else if(bPressed)
                        {
                            nIndexM = 1;
                        }
                    }
                }
                else
                {
                    if (bDropped && !bIsMenuMode)
                    {
                        nIndexC = 5;
                        nIndexM = 2;
                    }
                    else
                    {
                        if (bFocused)
                        {
                            nIndexC = 5;
                            nIndexM = 4;
                        }

                        if (bChecked)
                        {
                            nIndexC = 2;
                            nIndexM = 2;
                        }

                        if (bHighlightedC || bHighlightedM)
                        {
                            nIndexM = 4;

                            if (bPressed)
                            {
								if (bHighlightedC)
								{
									nIndexC = 1;
								}
								else if(bHighlightedM)
								{
									nIndexC = bChecked ? 3 : 5;
								} 
                            }
                            else 
                            {
                                nIndexC = bChecked ? 3 : 0;
                                if (bHighlightedM)
                                {
                                    nIndexC = bChecked ? 3 : 5;
                                    nIndexM = 0;
                                }
                               
                            }
                        }
                    }
                }
            }

            if (nIndexC != -1)
            {
                pRendererC->Draw(pDC,rectC,nIndexC);
            }

            if (nIndexM != -1)
            {
                pRendererM->Draw(pDC, rectM, nIndexM);
            }

            return (COLORREF) -1;
        }
        else 
        {
		    nIndex = -1;
            pRenderer = &m_ctrlRibbonBtn[0];
			if (rect.Height() > pRenderer->GetParams().m_rectImage.Height()*1.5 && m_ctrlRibbonBtn[1].IsValid())
			{
                pRenderer = &m_ctrlRibbonBtn[1];
			}

            if (bDisabled && bFocused)
            {
                if (pRenderer->GetImageCount() > 4)
                {
                    nIndex = 4;
                }
                else
                {
                    nIndex = 0;
                }
            }

            if (!bDisabled)
            {
                if (bChecked)
                {
                    nIndex = 2;
                }

                if (bPressed)
                {
                    if (bHighlighted)
                    {
                        nIndex = 1;
                    }
                }
                else if (bHighlighted)
                {
                    nIndex++;
                }
            }
        }
    }

    COLORREF clrText = bDisabled ? m_clrToolBarBtnTextDisabled : COLORREF(-1);

    if (pRenderer != NULL)
    {
        if (nIndex != -1)
        {
            int nCacheIndex = -1;
            if (pCache != NULL)
            {
                CSize size(rect.Size());
                nCacheIndex = pCache->FindIndex(size);
                if (nCacheIndex == -1)
                {
                    nCacheIndex = pCache->Cache(size, *pRenderer);
                }
            }

            if (nCacheIndex != -1)
            {
                pCache->Get(nCacheIndex)->Draw(pDC,rect, nIndex);
            }
            else
            {
                CDrawingManager dm(*pDC);
                dm.FillGradient2(rect, m_clrRibbonPanelBkTop, m_clrRibbonPanelBkBottom,90);
                pDC->Draw3dRect(rect,RGB(192,192,192),RGB(192,192,192));
            }

            if (!bDisabled)
            {
                clrText = m_clrToolBarBtnTextHighlighted;
            }

        }

    }
    return clrText;
}

COLORREF CMFCVisualManagerDeviant::OnDrawMenuLabel(CDC* pDC, CRect rect)
{
    ASSERT(pDC);

    pDC->FillRect(rect,&CBrush(m_clrRibbonBarBackground));
    CRect rectSeparator = rect;
    rectSeparator.top = rectSeparator.bottom - 2;

    DrawSeparator(pDC, rectSeparator,TRUE);

    return m_clrRibbonBarTextPB;
}

BOOL CMFCVisualManagerDeviant::OnEraseMDIClientArea(CDC* pDC, CRect rcClient)
{
    if (m_bCustomMDIClientAreaClr)
        pDC->FillSolidRect(&rcClient, m_clrMDIClientArea);
    else
        CMFCVisualManagerOffice2007::OnEraseMDIClientArea(pDC, rcClient);

    return TRUE;
}

COLORREF CMFCVisualManagerDeviant::LightenColor(long nScale, COLORREF lColor)
{
    long R = MulDiv( 255- GetRValue(lColor), nScale, 255) + GetRValue(lColor);
    long G = MulDiv(255 - GetGValue(lColor), nScale, 255) + GetGValue(lColor);
    long B = MulDiv(255 - GetBValue(lColor), nScale, 255) + GetBValue(lColor);

    return RGB(R, G,B);
}

COLORREF CMFCVisualManagerDeviant::DrakenColor(long nScale, COLORREF lColor)
{
    long nRed = MulDiv(255 - GetRValue(lColor), 255 - nScale, 255);
    long nGreen = MulDiv(255 - GetGValue(lColor), 255 - nScale, 255);
    long nBlue = MulDiv(255 - GetBValue(lColor), 255 - nScale, 255);

    return COLORREF();
}

2.另外窗口底部定义了一个停靠窗口,用来显示当前代码,主要是使用CDockablePane类。该类的主要作用是:实现可在停靠站点停靠或包含在选项卡式窗格中的窗格。主要成员函数可以参考MSDN:CDockablePane

该项目的主要流程是:首先在CMainFrame类中定义一个CMFCRibbonBar 类 | Microsoft Learn类,该类就是上面工程中的Ribbon工具栏类。接下来在在就是添加应用程序按钮类了:CMFCRibbonApplicationButton 类 | Microsoft Learn,然后添加Category类别CMFCRibbonCategory 类 | Microsoft Learn,该类的作用是:CMFCRibbonCategory 类可以实现包含一组功能区面板的功能区选项卡。功能区面板是CMFCRibbonPanel 类 | Microsoft Learn。最后在这些面板中添加想要的控件,这些控件包括:

Snipaste_2023-11-25_20-13-46

该程序的源代码如下:Gitee 或者微软官方文档下载[RibbonGadgets](VC2010Samples/MFC/Visual C++ 2008 Feature Pack/RibbonGadgets)

参考:

1.MFC - Ribbon学习

2.Ribbon控件

3.微软官方文档:MFC 桌面应用程序 | Microsoft Learn

-class?view=msvc-170),然后添加Category类别CMFCRibbonCategory 类 | Microsoft Learn,该类的作用是:CMFCRibbonCategory 类可以实现包含一组功能区面板的功能区选项卡。功能区面板是CMFCRibbonPanel 类 | Microsoft Learn。最后在这些面板中添加想要的控件,这些控件包括:

[外链图片转存中…(img-6LEoNMd8-1700915646295)]](https://img-blog.csdnimg.cn/img_convert/2f62c0b7c35d8847353d76d60fe3dcfb.png)

该程序的源代码如下:Gitee 或者微软官方文档下载[RibbonGadgets](VC2010Samples/MFC/Visual C++ 2008 Feature Pack/RibbonGadgets)

参考:

1.MFC - Ribbon学习

2.Ribbon控件

3.微软官方文档:MFC 桌面应用程序 | Microsoft Learn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值