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. 遥感图像处理笔记之【Automatic Flood Detection from Satellite Images Using Deep Learning】

    遥感图像处理学习(7) 前言 遥感系列第7篇.遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2023年12月29日 2024年1月24日搬运至本人博客园平台 文章标题:Automatic Fl ...

  2. 面试官:SpringCloudGateway过滤器类型有哪些?

    在 Spring Cloud Gateway 中,过滤器是在请求到达目标服务之前或之后,执行某些特定操作的一种机制.例如,它可以实现对传入的请求进行验证.修改.日志记录.身份验证.流量控制等各种功能. ...

  3. 【奶奶看了也不会】微信群聊(微信客服)接入ChatGPT教程

    1.聊天效果展示 大家好,我是小卷.最近工作变卷了,都已经一个月没更新文章了.今天来教教大家怎么给微信群聊的智能客服接入ChatGPT.和之前企业微信机器人不同的是,这次是可以外部微信群使用的.用的人 ...

  4. 单片机 IAP 功能基础开发篇之APP升级(一)

    引言 目的 主要介绍单片机 IAP 开发的设计思路,如何不使用下载烧录器的方式对单片机的程序进行升级,升级区域包括 bootloader 和用户程序的升级,升级方式有 UASRT 通信.CAN 通信和 ...

  5. SpringBoot-MyBatis - Java枚举类型 <---> MySQL Int,建立 类型处理器(typeHandlers)

    场景: MySQL里的某一个字段,比如:status状态,一共有5个状态,我们会在MySQL里 建立 status(int)字段,1.2.3.4.5 来标记5种状态:利用MyBatis在自动代码生成器 ...

  6. HBase-宽表和高表的对比

    一.宽表和高表定义 HBase 中的表可以设计为高表(tall-narrow table) 和 宽表(flat-wide table): (1) 宽表是指很多列较少行,即列多行少的表,一行中的数据量较 ...

  7. 【framework】Task简介

    1 前言 ​ Task 即任务,一个 Task 对应一个 Activity,其父容器为 TaskStack,子容器为 AppWindowToken. ​ 关于其父类及祖父类的介绍,见 → Window ...

  8. 基于角色的权限控制(RBAC)介绍

    什么是RBAC? RBAC(Role-Based Access Control)基于角色的权限控制.其基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集 ...

  9. SQL Server初体验

    概述 基于SQL Server 2019 Developer免费版搭建一个本地的开发环境. 下载安装 安装文件下载地址:https://www.microsoft.com/zh-cn/sql-serv ...

  10. Python2升级到Python3

    操作系统环境:CentOS Linux release 7.4.1708 (Core). 系统默认Python版本为2.7. 升级前的版本信息: [root@cch-spider-web1 ~]# l ...