首先在MainFrm.cpp的OnCreate函数里找到类似以下几行代码:
//CString strTitlePane1;
//CString strTitlePane2;
//bNameValid =
strTitlePane1.LoadString(IDS_STATUS_PANE1);
//ASSERT(bNameValid);
//bNameValid =
strTitlePane2.LoadString(IDS_STATUS_PANE2);
//ASSERT(bNameValid);
//m_wndStatusBar.AddElement(new
CMFCRibbonStatusBarPane (ID_STATUSBAR_PANE1, //strTitlePane1, TRUE), strTitlePane1);
上面是系统添加的,可以注释掉不要。添加上自己的,如下:
CMyMFCRibbonStatusBarPane* pElem = NULL;
m_wndStatusBar.AddElement(new
CMyMFCRibbonStatusBarPane(ID_STATUSBAR_PANE_PIXELCLK,
m_strPixelClk, TRUE), "");
pElem =
(CMyMFCRibbonStatusBarPane*)m_wndStatusBar.GetElement(0);
pElem->SetAlmostLargeText("像素时钟:........................................");
m_wndStatusBar.AddSeparator();
m_wndStatusBar.AddElement(new
CMyMFCRibbonStatusBarPane(ID_STATUSBAR_PANE_FRMCLK, m_strFrmClk,
TRUE), "");
pElem =
(CMyMFCRibbonStatusBarPane*)m_wndStatusBar.GetElement(2);
pElem->SetAlmostLargeText("帧时钟:........................................");
以上代码会在状态栏上创建两个窗格。
SetAlmosteLargeText函数和参数的意思是,所创建的窗格会尽量保持和"像素时钟:........................................"一样的宽度,如果不这样设置,那“像素时钟:”后面要加上其他内容就会因为宽度不够而不能显示。
CMyMFCRibbonStatusBarPane这个类是重载CMFCRibbonStatusBarPane具体如下所示:
//MyMFCRibbonStatusBarPane.h
//重载CMFCRibbonStatusBarPane类
#pragma once
#include
class CMyMFCRibbonStatusBarPane : public
CMFCRibbonStatusBarPane
{
public:
CMyMFCRibbonStatusBarPane(
UINT nCmdID, // Pane command id
LPCTSTR lpszText, // Pane label
BOOL bIsStatic =
FALSE, // Pane is static (non-clickable)
HICON hIcon =
NULL, // Pane icon
LPCTSTR lpszAlmostLargeText = NULL);// The almost large text in pane
int DrawRibbonText(CDC* pDC, const
CString& strText, CRect rectText, UINT uiDTFlags, COLORREF
clrText = (COLORREF)-1);
protected:
BOOL m_bIsValid; //通过时钟信号有效性设置提示字体颜色
public:
void SetSignal(BOOL
bIsValid =
FALSE); //设置信号
};
//MyMFCRibbonStatusBarPane.cpp
//
#include "stdafx.h"
#include "MyMFCRibbonStatusBarPane.h"
CMyMFCRibbonStatusBarPane::CMyMFCRibbonStatusBarPane(UINT
nCmdID, LPCTSTR lpszText, BOOL bIsStatic , HICON hIcon , LPCTSTR
lpszAlmostLargeText )
{
CommonInit();
m_strAlmostLargeText = (lpszAlmostLargeText ==
NULL) ? _T("") : lpszAlmostLargeText;
m_bIsStatic = bIsStatic;
m_bIsValid = FALSE;
}
int CMyMFCRibbonStatusBarPane::DrawRibbonText(CDC* pDC, const
CString& strText, CRect rectText, UINT uiDTFlags, COLORREF
clrText )
{
ASSERT_VALID(this);
ASSERT_VALID(pDC);
uiDTFlags = DT_SINGLELINE | DT_VCENTER |
DT_END_ELLIPSIS;
if (m_nTextAlign == TA_CENTER)
{
uiDTFlags |= DT_CENTER;
}
else if (m_nTextAlign == TA_RIGHT)
{
uiDTFlags |= DT_RIGHT;
rectText.right -=
m_szMargin.cx;
}
if (m_bIsValid)
{
clrText = RGB(0, 255, 0);
}
else
{
clrText = RGB(255, 0, 0);
}
return CMFCRibbonButton::DrawRibbonText(pDC,
strText, rectText, uiDTFlags, clrText);
}
void CMyMFCRibbonStatusBarPane::SetSignal(BOOL bIsValid )
{
m_bIsValid = bIsValid;
}
复制了一个CMFCRibbonStatusBarPane的一个构造函数和DrawRibbonText,把类名改为CMyMFCRibbonStatusBarPane即可。由于DrawRibbonText在CMFCRibbonStatusBarPane类中是virtual函数,所以改写这个函数后,CMyMFCRibbonStatusBarPane对象会调用改写后的函数。主要就是改此函数的最后一句return
CMFCRibbonButton::DrawRibbonText(pDC, strText, rectText, uiDTFlags,
clrText);
复制完之后是没有最后一个参数的,改变颜色就是靠这个参数。而且这个函数类似于View类的OnDraw函数,不需要主动调用,所以加了一个控制函数SetSignal来改变颜色。
在需要设置状态栏窗格的颜色的地方作如下调用,就能改变颜色:
pElem =
(CMyMFCRibbonStatusBarPane*)m_wndStatusBar.GetElement(0);
if (pClkSig->nPixelClk == 1)
{
str = m_strPixelClk +
"Valid";
pElem->SetSignal(TRUE);
}
else
{
str = m_strPixelClk +
"Invalid";
pElem->SetSignal(FALSE);
}
pElem->SetText(str);
pElem->Redraw();