MFC里面的CStatusBar是没法自定义文字颜色的,需要我们自己绘制。这篇文章是在 Display colored text on Status Bar 代码的基础上进行改进的,使用起来更方便。

实现新建一个单文本框架的MFC程序,如下图所示:



在MainFrm.h中,在类定义之前引入头文件:

#include " ColoredStatusBarCtrl.h"

将MainFrm.h中的m_wndStatusBar换成CColoredStatusBarCtrl类型,代码如下:

//CStatusBar m_wndStatusBar;
CColoredStatusBarCtrl m_wndStatusBar;

找到MainFrm.cpp中自动生成的数组,代码如下:

static UINT indicators[] =
{
ID_SEPARATOR, // 状态行指示器
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};

在CMainFrame::OnCreate()函数 return 之前初始化 m_wndStatusBar,代码如下:

//可以设置自动大小
m_wndStatusBar.AutoSize = true; //初始化每个窗格
for (int i = 0; i < sizeof(indicators) / sizeof(UINT); i++)
{
CString str;
str = " ";
//更改状态栏样式,使其由所有者绘制
bool ret = m_wndStatusBar.GetStatusBarCtrl().SetText(str, i, SBT_OWNERDRAW);
//使每个窗格的大小相同
m_wndStatusBar.SetPaneInfo(i, m_wndStatusBar.GetItemID(i), SBT_OWNERDRAW, 100);
} //设置字符串
CString str;
str = "123";
m_wndStatusBar.SetText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_NUM), str, RGB(255, 0, 0));

ColoredStatusBarCtrl.h 文件内容如下:

#if !defined(AFX_COLOREDSTATUSBARCTRL_H__4D49433F_617D_45A5_A207_5655A0BE779F__INCLUDED_)
#define AFX_COLOREDSTATUSBARCTRL_H__4D49433F_617D_45A5_A207_5655A0BE779F__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif #include <afxext.h> class CColoredStatusBarCtrl : public CStatusBar
{
public:
CColoredStatusBarCtrl();
public:
CString m_szStatusString;
public:
bool AutoSize=true;
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
void SetText(UINT nID, CString txt, COLORREF cr);
public:
virtual ~CColoredStatusBarCtrl();
protected:
CMap<UINT, UINT, COLORREF, COLORREF>m_TxtColorMap;
CMap<UINT, UINT, CString, CString>m_TxtMap;
DECLARE_MESSAGE_MAP()
}; #endif

ColoredStatusBarCtrl.cpp 文件内容如下:

// ColoredStatusBarCtrl.cpp : implementation file
//
#include "pch.h"
//#include "dlgviewtest.h"
#include "ColoredStatusBarCtrl.h" #ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif CColoredStatusBarCtrl::CColoredStatusBarCtrl(){} CColoredStatusBarCtrl::~CColoredStatusBarCtrl(){} BEGIN_MESSAGE_MAP(CColoredStatusBarCtrl, CStatusBar)
//{{AFX_MSG_MAP(CColoredStatusBarCtrl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP() void CColoredStatusBarCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// Attach to a CDC object
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
dc.SetBkMode(TRANSPARENT); // Get the pane rectangle and calculate text coordinates
CRect rect(&lpDrawItemStruct->rcItem);
COLORREF cr;
CString txt;
if (m_TxtColorMap.Lookup(lpDrawItemStruct->itemID, cr))
{
dc.SetTextColor(cr);
}
if (m_TxtMap.Lookup(lpDrawItemStruct->itemID, txt))
{
dc.TextOut(rect.left + 2, rect.top, txt);
if (AutoSize)
{
//设置提示框宽度
CSize sz = dc.GetTextExtent(txt);
SetPaneInfo(lpDrawItemStruct->itemID, lpDrawItemStruct->CtlID, SBT_OWNERDRAW, sz.cx);
}
}
// Detach from the CDC object, otherwise the hDC will be
// destroyed when the CDC object goes out of scope
dc.Detach();
}
void CColoredStatusBarCtrl::SetText(UINT nID,CString txt, COLORREF cr)
{
m_TxtColorMap.SetAt(nID, cr);
m_TxtMap.SetAt(nID, txt);
//触发重绘
SetPaneText(nID, txt);
}

附件:ColorstatusbarDemo 提取码: vhrs

MFC自定义CStatusBar文字的颜色的更多相关文章

  1. css3应用之自定义选中文字的背景颜色

    在看很多的博客主题时候发现大多数都对选中文字的背景颜色做了相应的处理.其实这样是很符合用户体验的.因为有很多的人会用鼠标选择着一行一行的阅读.其中就包括本人... 浏览器中默认的选中的文字颜色为白色, ...

  2. 使用系统UITabbarItem自定义图片显示原本颜色和自定义文字颜色

    ...... ThirdViewController *thirdVC = [[ThirdViewControlleralloc]initWithTitle:@"搜索信息"]; / ...

  3. Android SearchView 自定义SearchIcon和字体颜色大小

    自定义SearchView的搜索图标和字体属性相对复杂一些,记下来. 一.自定义SearchIcon 1.API版本低于21:版本小于21时,要修改SearchIcon比较复杂,需要先获取到Searc ...

  4. WPF自定义空心文字

    首先创建一个自定义控件,继承自FrameworkElement,“Generic.xaml”中可以不添加样式. 要自定义空心文字,要用到绘制格式化文本FormattedText类.FormattedT ...

  5. Android之自定义画图文字动画

    结构: BaseView: package com.caiduping.canvas; import android.content.Context; import android.graphics. ...

  6. MPAndroidChart柱子上的文字的颜色dataSet.setValueTextColors

    版本:MPAndroidChart v3.1.0 这是个很强大的图表,不同的版本对应的API会不一样. 需求描述: 用了柱状图,但要实现这样的功能,通过不同的门店来区分不同的柱子的颜色,并且柱子上文字 ...

  7. Android实现自定义带文字和图片的Button

    Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...

  8. iOS开发中设置UITextField的占位文字的颜色,和光标的颜色

    在iOS开发中,对于很多初学者而言,很有可能碰到需要修改UITextField的占位文字的颜色,以及当UITextField成为第一响应者后光标的颜色,那么下面小编就介绍一下修改占位文字和光标的颜色. ...

  9. android textview改变部分文字的颜色和string.xml中文字的替换(转)

    转   :http://blog.csdn.net/ljz2009y/article/details/23878669 一:TextView组件改变部分文字的颜色: TextView textView ...

  10. iOS7 修改导航系统默认返回按钮文字及颜色

    //iOS7 修改系统默认返回按钮文字及颜色 UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"返" ...

随机推荐

  1. Python 多线程实现爬取图片

    前阵子网上看到有人写爬取妹子图的派森代码,于是乎我也想写一个教程,很多教程都是调用的第三方模块,今天就使用原生库来爬,并且扩展实现了图片鉴定,图片去重等操作,经过了爬站验证,稳如老狗,我已经爬了几万张 ...

  2. C/C++ Qt 信号自定义槽函数

    Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师学生为例子简单学习一下信号与槽函数的使用方法. 使用无参数信号与槽: 首先定义一个teacher类,该类 ...

  3. asp.net 生成word,处理图片,富文本框内容图片处理

    //基本导出方法public void Download() { Random rd = new Random(); string fileName = DateTime.Now.ToString(& ...

  4. 苹果新一代“超级芯片”曝光:M3 Ultra最高可达32核CPU

    近日,据外媒消息,苹果计划在2024年推出新一代"超级芯片"M3 Ultra. 据悉,M3 Ultra将大幅增加CPU核心数量,同时GPU核心数量也将适度增加. 具体来说,M3 U ...

  5. 万字手撕AVL树 | 上百行的旋转你真的会了吗?【超用心超详细图文解释 | 一篇学会AVL】

    说在前面 今天这篇博客,是博主今年以来最最用心的一篇博客.我们也很久没有更新数据结构系列了,几个月前博主用心深入的学习了这颗二叉平衡搜索树,博主被它的查找效率深深吸引. AVL树出自1962年中的一篇 ...

  6. 高精度模板 大数减大数 可变数组vector实现

    vector<int> Sub(vector<int>& A, vector<int>& B)//这里默认长数减去短数 { vector<in ...

  7. 国产数据库TiDB初体验:简单易用,快速上手

    最近开始关注国产数据库的发展,为了能从技术人员的角度来实际体验国产中目前最流行的TiDB数据库,从今天起,在官方公布的课程开始正面了解TiDB的设计理念. 看了2小时的入门课程介绍,总体来说,还是有不 ...

  8. 介绍 ComPDFKit 转换 SDK 1.5.0

    介绍 ComPDFKit 转换 SDK 1.5.0 了解有关 ComPDFKit PDF SDK 的更多信息:https ://www.compdf.com/ ComPDFKit Conversion ...

  9. Android架构组件LiveData

    LiveData LiveData是基于观察者模式创建的,其中,LiveData是被观察者,观察者通过注册方法,监听被观察者的数据变化.LiveData在数据发生变化的时候,会通知观察者. LiveD ...

  10. 关于动态抽样(Dynamic Sampling)

    关于动态抽样(Dynamic Sampling) 原文:http://www.oracle.com/technetwork/issue-archive/2009/09-jan/o19asktom-08 ...