MFC自定义CStatusBar文字的颜色

打印 上一主题 下一主题

主题 925|帖子 925|积分 2775

MFC里面的CStatusBar是没法自定义文字颜色的,需要我们自己绘制。这篇文章是在 Display colored text on Status Bar 代码的基础上进行改进的,使用起来更方便。
实现新建一个单文本框架的MFC程序,如下图所示:

在MainFrm.h中,在类定义之前引入头文件:
  1. #include " ColoredStatusBarCtrl.h"
复制代码
将MainFrm.h中的m_wndStatusBar换成CColoredStatusBarCtrl类型,代码如下:
  1. //CStatusBar m_wndStatusBar;
  2. CColoredStatusBarCtrl m_wndStatusBar;
复制代码
找到MainFrm.cpp中自动生成的数组,代码如下:
  1. static UINT indicators[] =
  2. {
  3.         ID_SEPARATOR,           // 状态行指示器
  4.         ID_INDICATOR_CAPS,
  5.         ID_INDICATOR_NUM,
  6.         ID_INDICATOR_SCRL,
  7. };
复制代码
在CMainFrame::OnCreate()函数 return 之前初始化 m_wndStatusBar,代码如下:
  1. //可以设置自动大小
  2. m_wndStatusBar.AutoSize = true;
  3. //初始化每个窗格
  4. for (int i = 0; i < sizeof(indicators) / sizeof(UINT); i++)
  5. {
  6.         CString str;
  7.         str = " ";
  8.         //更改状态栏样式,使其由所有者绘制
  9.         bool ret = m_wndStatusBar.GetStatusBarCtrl().SetText(str, i, SBT_OWNERDRAW);
  10.         //使每个窗格的大小相同
  11.         m_wndStatusBar.SetPaneInfo(i, m_wndStatusBar.GetItemID(i), SBT_OWNERDRAW, 100);
  12. }
  13. //设置字符串
  14. CString str;
  15. str = "123";
  16. m_wndStatusBar.SetText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_NUM), str, RGB(255, 0, 0));
复制代码
ColoredStatusBarCtrl.h 文件内容如下:
  1. #if !defined(AFX_COLOREDSTATUSBARCTRL_H__4D49433F_617D_45A5_A207_5655A0BE779F__INCLUDED_)
  2. #define AFX_COLOREDSTATUSBARCTRL_H__4D49433F_617D_45A5_A207_5655A0BE779F__INCLUDED_
  3. #if _MSC_VER > 1000
  4. #pragma once
  5. #endif
  6. #include <afxext.h>
  7. class CColoredStatusBarCtrl : public CStatusBar
  8. {
  9. public:
  10.         CColoredStatusBarCtrl();
  11. public:
  12.         CString m_szStatusString;
  13. public:
  14.         bool AutoSize=true;
  15.         void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  16.         void SetText(UINT nID, CString txt, COLORREF cr);
  17. public:
  18.         virtual ~CColoredStatusBarCtrl();       
  19. protected:       
  20.         CMap<UINT, UINT, COLORREF, COLORREF>m_TxtColorMap;
  21.         CMap<UINT, UINT, CString, CString>m_TxtMap;
  22.         DECLARE_MESSAGE_MAP()
  23. };
  24. #endif
复制代码
ColoredStatusBarCtrl.cpp 文件内容如下:
  1. // ColoredStatusBarCtrl.cpp : implementation file
  2. //
  3. #include "pch.h"
  4. //#include "dlgviewtest.h"
  5. #include "ColoredStatusBarCtrl.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. CColoredStatusBarCtrl::CColoredStatusBarCtrl(){}
  12. CColoredStatusBarCtrl::~CColoredStatusBarCtrl(){}
  13. BEGIN_MESSAGE_MAP(CColoredStatusBarCtrl, CStatusBar)
  14.         //{{AFX_MSG_MAP(CColoredStatusBarCtrl)
  15.         //}}AFX_MSG_MAP
  16. END_MESSAGE_MAP()
  17. void CColoredStatusBarCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  18. {       
  19.         // Attach to a CDC object
  20.         CDC dc;
  21.         dc.Attach(lpDrawItemStruct->hDC);
  22.         dc.SetBkMode(TRANSPARENT);
  23.         // Get the pane rectangle and calculate text coordinates
  24.         CRect rect(&lpDrawItemStruct->rcItem);
  25.         COLORREF cr;
  26.         CString txt;
  27.         if (m_TxtColorMap.Lookup(lpDrawItemStruct->itemID, cr))
  28.         {
  29.                 dc.SetTextColor(cr);
  30.         }
  31.         if (m_TxtMap.Lookup(lpDrawItemStruct->itemID, txt))
  32.         {
  33.                 dc.TextOut(rect.left + 2, rect.top, txt);
  34.                 if (AutoSize)
  35.                 {
  36.                         //设置提示框宽度       
  37.                         CSize sz = dc.GetTextExtent(txt);
  38.                         SetPaneInfo(lpDrawItemStruct->itemID, lpDrawItemStruct->CtlID, SBT_OWNERDRAW, sz.cx);
  39.                 }               
  40.         }
  41.         // Detach from the CDC object, otherwise the hDC will be
  42.         // destroyed when the CDC object goes out of scope
  43.         dc.Detach();
  44. }
  45. void CColoredStatusBarCtrl::SetText(UINT nID,CString txt, COLORREF cr)
  46. {
  47.         m_TxtColorMap.SetAt(nID, cr);
  48.         m_TxtMap.SetAt(nID, txt);
  49.         //触发重绘       
  50.         SetPaneText(nID, txt);
  51. }
复制代码
附件:ColorstatusbarDemo 提取码: vhrs

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表