mfc ribbon动态修改字符_设置CMFCRibbonStatusBarPane的字体颜色--MFC Ribbon风格

首先在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();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值