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. Linux 配置Quota磁盘配额

    由于Linux是一个多用户管理的操作系统,而Linux默认情况下并不限制每个用户使用磁盘空间的大小,假如某个用户疏忽或者恶意占满磁盘空间,将导致系统磁盘无法写入甚至崩溃,为了保证系统磁盘的有足够的剩余 ...

  2. 创建多线程方式(Java)

    一.创建自定义线程类继承Thread 自定义线程类代码 package com.demo05; public class MyThread extends Thread { @Override pub ...

  3. vue下载本地文件 下载二进制流文件 兼容ie

    vue-cli2要下载的静态文件放在static目录下,vue-cli3则放在public目录下 ie不支持 h5 的download写法,故用以下写法 <el-button type=&quo ...

  4. 创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

      本文介绍基于C++语言GDAL库,批量创建大量栅格遥感影像文件,并将数据批量写入其中的方法.   首先,我们来明确一下本文所需实现的需求.已知我们对大量遥感影像进行了批量读取与数据处理操作--具体 ...

  5. Flutter聊天室|dart+flutter仿微信App界面|flutter聊天实例

    一.项目概述 flutter-chatroom是采用基于flutter+dart+chewie+image_picker+photo_view等技术跨端开发仿微信app界面聊天室项目.实现了消息发送/ ...

  6. 17.1 使用内存映射文件--《Windows核心编程》

    Windows 提供了以下三种机制来对内存进行操控虚拟内存:最适合用来管理大量对象数组或者大型数据结构内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间的共享数据 ...

  7. 【.net core学习一】.net 5.0 webapi部署

    服务器:windows server 2012 x64 1.安装IIS: 2.下载并安装 dotnet-hosting-5.0.13-win.exe 下载地址: https://dotnet.micr ...

  8. ASP.NET Core分布式项目实战(oauth2与open id connect 对比)--学习笔记

    任务14:oauth2与open id connect 对比 以微博开放平台为例(微博登录接入--授权机制): https://open.weibo.com/wiki/授权机制 可以看到微博登录接入使 ...

  9. Linux-ln命令创建链接(软连接/硬链接)

    1.ln命令介绍 ln命令可以看作是 link 的缩写,其功能是创建文件间的链接,链接类型包括硬链接(hard link)和软链接(符号链接,symbolic link) 2.ln命令格式 ln 命令 ...

  10. CF1842

    A 比两边和的大小即可. B 显然如果一个数拥有的所有二进制位的 \(1\) 被包含在 \(x\) 中,选了一定不会导致不能变成 \(x\):如果有一个 \(1\),\(x\) 对应的位上是 \(0\ ...