MFC 可以设置背景色、字体、字体颜色、透明背景的 Static 静态文本控件

转载 2015年07月07日 08:56:03

转自:http://blog.csdn.net/cashey1991/article/details/7545614

MFC库里没有符合这个条件的控件,于是我自己写了一个,初步测试有效。


注:可以设置透明背景,但还不能做到透明度设置(如50%透明度)

        如果设置了背景色,就不保留透明背景

        默认背景色是透明的

  1. // 设置背景色(若clr为CLR_NONE,则背景透明)  
  2. void SetBackgroundColor(COLORREF clr){m_clrBackground = clr;}  
  3. // 设置文字前景色  
  4. void SetTextColor(COLORREF clr){m_clrText = clr;}  
  5. // 设置文字字体  
  6. void SetFont(CString strFaceName, LONG nHeight);  


如何使用:

    1.先将RichStatic.h和RichStatic.cpp添加入工程
    2.对话框添加Static控件后,增加一个控件变量,类型设置为CRichStatic(或手动添加,在对话框类DoDataExchange中添加DDX_Control)


源码:

  1. #pragma once  
  2.   
  3.   
  4. // CRichStatic  
  5.   
  6. class CRichStatic : public CStatic  
  7. {  
  8.     DECLARE_DYNAMIC(CRichStatic)  
  9.   
  10. public:  
  11.     CRichStatic();  
  12.     virtual ~CRichStatic();  
  13.       
  14. protected:  
  15.     afx_msg BOOL OnEraseBkgnd(CDC* pDC);  
  16.     afx_msg LRESULT OnSetText(WPARAM,LPARAM);  
  17.     DECLARE_MESSAGE_MAP()  
  18.     virtual void PreSubclassWindow();  
  19.   
  20. private:  
  21.     COLORREF m_clrText;          // 文字前景色  
  22.     COLORREF m_clrBackground;    // 文字背景色  
  23.     CFont *m_pTextFont;          // 文字字体  
  24.     CBitmap m_Bmp;               // 保存背景用的位图对象  
  25.     BOOL m_selfCreated;  
  26. public:  
  27.     // 设置背景色(若clr为CLR_NONE,则背景透明)  
  28.     void SetBackgroundColor(COLORREF clr){m_clrBackground = clr;}  
  29.     // 设置文字前景色  
  30.     void SetTextColor(COLORREF clr){m_clrText = clr;}  
  31.     // 设置文字字体  
  32.     void SetFont(CString strFaceName, LONG nHeight);  
  33.   
  34. public:  
  35.     virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);  
  36. };  

  1. // RichStatic.cpp : 实现文件  
  2. //  
  3.   
  4.   
  5. #include "stdafx.h"  
  6. #include "RichStatic.h"  
  7.   
  8.   
  9.   
  10.   
  11. // CRichStatic  
  12.   
  13.   
  14. IMPLEMENT_DYNAMIC(CRichStatic, CStatic)  
  15.   
  16.   
  17. CRichStatic::CRichStatic():  
  18.     m_clrText(0), m_clrBackground(CLR_NONE), m_hFont(NULL), m_selfCreated(FALSE),   
  19.     m_xAlignment(X_LEFT), m_yAlignment(Y_TOP)  
  20. {  
  21.   
  22.   
  23. }  
  24.   
  25.   
  26. CRichStatic::~CRichStatic()  
  27. {  
  28.     if (m_selfCreated && m_hFont != NULL)  
  29.     {  
  30.         DeleteObject(m_hFont);    // 若字体对象为对象自己创建并且不为NULL,则销毁掉以释放内核对象  
  31.     }  
  32. }  
  33.   
  34.   
  35.   
  36.   
  37. BEGIN_MESSAGE_MAP(CRichStatic, CStatic)  
  38.    ON_MESSAGE(WM_SETTEXT,OnSetText)  
  39.    ON_WM_ERASEBKGND()  
  40. END_MESSAGE_MAP()  
  41.   
  42.   
  43.   
  44.   
  45.   
  46.   
  47. // CRichStatic 消息处理程序  
  48.   
  49.   
  50. void CRichStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
  51. {  
  52.     if (m_clrBackground != CLR_NONE)    // 若背景色不为CLR_NONE(CLR_NONE表示无背景色),则绘制背景  
  53.     {  
  54.         RECT rect;  
  55.         GetWindowRect(&rect);  
  56.         CBrush brush;  
  57.         brush.CreateSolidBrush(m_clrBackground);  
  58.         ::SelectObject(lpDrawItemStruct->hDC, brush.m_hObject);    // 设置画刷颜色  
  59.         ::SelectObject(lpDrawItemStruct->hDC, GetStockObject(NULL_PEN));    // 设置笔为空笔(不绘制边界)  
  60.         Rectangle(lpDrawItemStruct->hDC, 0, 0,rect.right - rect.left, rect.bottom - rect.top);  
  61.     }  
  62.   
  63.   
  64.     CString strCaption;    // 标题文字  
  65.     GetWindowText(strCaption);  
  66.     if (m_hFont != NULL)  
  67.     {  
  68.         ::SelectObject(lpDrawItemStruct->hDC, m_hFont);  
  69.     }  
  70.   
  71.   
  72.     // 计算输出字串的横纵坐标   
  73.     int x = 0, y = 0;  
  74.     if (X_LEFT != m_xAlignment || Y_TOP != m_yAlignment)    // 不是左对齐或不是顶对齐  
  75.     {  
  76.         CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);  
  77.         CRect crect;  
  78.         GetWindowRect(&crect);  
  79.         CSize size = pDC->GetTextExtent(strCaption);  
  80.         if (X_RIGHT == m_xAlignment)    // 右对齐  
  81.         {  
  82.             x = crect.Width() - size.cx;  
  83.         }  
  84.         else if (X_CENTER == m_xAlignment)   // X居中对齐  
  85.         {  
  86.             x = (crect.Width()- size.cx) / 2;  
  87.         }  
  88.   
  89.   
  90.         if (Y_BOTTOM == m_yAlignment)   // 顶对齐  
  91.         {  
  92.             y = crect.Height() - size.cy;  
  93.         }  
  94.         else if (Y_CENTER == m_yAlignment)   // Y居中对齐  
  95.         {  
  96.             y = (crect.Height() - size.cy) / 2;  
  97.         }  
  98.     }  
  99.     // 设置dc字串颜色  
  100.     ::SetTextColor(lpDrawItemStruct->hDC, m_clrText);  
  101.     TextOut(lpDrawItemStruct->hDC, x, y, strCaption, strCaption.GetLength());  
  102. }  
  103.   
  104.   
  105. void CRichStatic::PreSubclassWindow()  
  106. {  
  107.     CStatic::PreSubclassWindow();  
  108.     ModifyStyle(0, SS_OWNERDRAW);  
  109. }  
  110.   
  111.   
  112. void CRichStatic::SetFont(CString strFaceName, LONG nHeight)  
  113. {  
  114.     if (m_selfCreated && m_hFont != NULL)  
  115.     {  
  116.         DeleteObject(m_hFont);    // 若字体对象为对象自己创建并且不为NULL,则销毁掉以释放内核对象  
  117.     }  
  118.     CFont cfont;  
  119.     LOGFONT lf;  
  120.     memset(&lf, 0, sizeof lf);    // 清空LOGFONT结构体,之后对其赋值  
  121.     lf.lfHeight = nHeight;  
  122.     _tcscpy_s(lf.lfFaceName, strFaceName.GetBuffer());    // 将字体名拷贝到LOGFONT结构体中  
  123.     VERIFY(cfont.CreateFontIndirect(&lf));    // 创建新的字体  
  124.     m_hFont = (HFONT)cfont.m_hObject;  
  125.     m_selfCreated = TRUE;    // 标记字体为自己创建的  
  126. }  
  127.   
  128.   
  129. void CRichStatic::SetFont(HFONT hFont)  
  130. {  
  131.     if (m_selfCreated && m_hFont != NULL)  
  132.     {  
  133.         DeleteObject(m_hFont);    // 若字体对象为对象自己创建并且不为NULL,则销毁掉以释放内核对象  
  134.     }  
  135.     m_hFont = hFont;  
  136.     m_selfCreated = FALSE;   // 标记字体非自己创建  
  137. }  
  138.   
  139.   
  140. void CRichStatic::SetFont(const CFont *pFont)  
  141. {  
  142.     if (m_selfCreated && m_hFont != NULL)  
  143.     {  
  144.         DeleteObject(m_hFont);    // 若字体对象为对象自己创建并且不为NULL,则销毁掉以释放内核对象  
  145.     }  
  146.     m_hFont = (HFONT)pFont->m_hObject;  
  147.     m_selfCreated = FALSE;   // 标记字体非自己创建  
  148. }  
  149.   
  150.   
  151. BOOL CRichStatic::OnEraseBkgnd(CDC* pDC)  
  152. {  
  153.     // 当背景色为透明时,需要保存与拷贝显示主框的显示区域  
  154.     if (m_clrBackground == CLR_NONE)  
  155.     {  
  156.         if (m_Bmp.GetSafeHandle() == NULL)  
  157.         {  
  158.             CRect Rect;  
  159.             GetWindowRect(&Rect);  
  160.             CWnd *pParent = GetParent();  
  161.             ASSERT(pParent);  
  162.             pParent->ScreenToClient(&Rect);  // 将坐标转换为与主对话框相对应  
  163.         
  164.             // 拷贝对应区域主框显示的内容  
  165.             CDC *pDC = pParent->GetDC();  
  166.             CDC MemDC;  
  167.             MemDC.CreateCompatibleDC(pDC);  
  168.             m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());  
  169.             CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);  
  170.             MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY);  
  171.             MemDC.SelectObject(pOldBmp);  
  172.             MemDC.DeleteDC();    // 删除内存DC,否则内存泄漏  
  173.             pParent->ReleaseDC(pDC);  
  174.         }  
  175.         else // 将主框显示的内容拷贝回去  
  176.         {  
  177.             CRect Rect;  
  178.             GetClientRect(Rect);  
  179.             CDC MemDC;  
  180.             MemDC.CreateCompatibleDC(pDC);  
  181.             CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);  
  182.             pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);  
  183.             MemDC.SelectObject(pOldBmp);  
  184.             MemDC.DeleteDC();    // 删除内存DC,否则内存泄漏  
  185.         }  
  186.     }  
  187.   
  188.   
  189.     return TRUE;  
  190. }  
  191.   
  192.   
  193. LRESULT CRichStatic::OnSetText(WPARAM wParam,LPARAM lParam)  
  194. {  
  195.     LRESULT Result = Default();  
  196.     Invalidate();  
  197.     UpdateWindow();  
  198.     return Result;  
  199. }  

MFC静态文本控件如何设置字体--大小和颜色及背景色

CFont font;  font.CreateFont(10,10,0,0,FW_BLACK,FALSE,FALSE,   FALSE,GB2312_CHARSET,OUT_DEFAULT_PR...
  • u014023993
  • u014023993
  • 2014年04月14日 09:58
  • 1238

Win32设置修改STATIC控件字体、颜色

#include "stdafx.h"#define IDC_FILTER_STATIC 1001HINSTANCE g_hInstance;LRESULT CALLBACK WindowProc(H...
  • pdsleo
  • pdsleo
  • 2017年08月24日 15:02
  • 375

修改static控件背景颜色和文字颜色

当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息。如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,...
  • softn
  • softn
  • 2016年06月20日 06:41
  • 1941

MFC 改变static字体颜色、大小、背景颜色【自定义类】

新建一个MFC标准Dialog工程并生成一个CStatic的自定义类,我的类名为CColorStatic 定义必要变量 protected: COLORREF m_crText; // 字体颜色...
  • kingsollyu
  • kingsollyu
  • 2011年11月15日 16:01
  • 22940

修改Static控件的字体颜色

首先在窗体上添加WM_CTLCOLOR消息,这时就会有一个OnCtlColor消息响应函数。下面是我的OnCtlColor函数里的代码HBRUSH CMyMailDlg::OnCtlColor(CDC...
  • SysProgram
  • SysProgram
  • 2011年07月04日 11:00
  • 3869

OnCtlColor函数:MFC设置静态文本框,编辑框等控件背景和字体颜色

在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型: afx_msg HBRUSH O...
  • chen1083376511
  • chen1083376511
  • 2017年07月04日 12:14
  • 276

VC设置静态文本控件的显示字体和显示内容

 首先,在对话框上添加一个Static控件,关联一个控制变量m_static(不是Value,是Control) 然后,建立一个字体变量 [cpp] view plainco...
  • ac540101928
  • ac540101928
  • 2014年08月25日 09:17
  • 2141

mfc中设置statictext的字体和颜色

字体在控制事件中实现,颜色在OnCtlColor中实现。 界面上两个button,一个statictext。 设置statictext的value变量为m_csText; 其余变量为: ...
  • langxm2006
  • langxm2006
  • 2017年08月05日 23:48
  • 433

VC MFC中修改STATIC的文本颜色和文本字体等

1. 打开资源视图。 2. 双击打开STATIC所在的对话框。 3. 修改STATIC的ID属性,这里假设为IDC_TEXT1。 4.为对话框添加类,假设为CMyDialog. ...
  • qq61394323
  • qq61394323
  • 2014年10月09日 21:28
  • 4152

设置static控件背景颜色、控件字体的背景颜色和控件字体的颜色

注:转载至:https://my.oschina.net/u/241930/blog/528285,谢谢该博主的分享 #include LRESULT CALLBACK Wn...
  • stf1065716904
  • stf1065716904
  • 2017年06月23日 20:39
  • 314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 可以设置背景色、字体、字体颜色、透明背景的 Static 静态文本控件
举报原因:
原因补充:

(最多只允许输入30个字)