可改变颜色的文本,可实现透明文本

首先有个问题必须弄明白:
消息反射——允许控件在给父窗口发送OnCtlColor消息前就自行处理的消息
几种属性——前景色,背景色,背景刷。
                          一个CStaitc控件在UI表现上有以上3种属性。前景色即文本颜色,背景色是文本背后的颜色。
                          画刷则控制整个控件区域的色彩显示,如果控件区域比文本所占区域大,那你会发现这个色
                          彩和背景色的区别
---------------------------------------------------------------------------------------------- 
更新时间:2007年01月13日
改进后的文本能使用SetWndowText函数进行实现动态文本.
          
源代码文件如下:
// 类的声明文件
//--------------------------------------------------------------------------------------
// 类说明:可改变文本颜色和背景颜色,也可为透明的CColorStatic
// By   Yao Debo  
// E-mail:yaodebo@163.com
//--------------------------------------------------------------------------------------
// ColorStatic.h: Head file
#pragma once
class CColorStatic : public CStatic
{
public:
       CColorStatic();
public:
       void SetBkColor(COLORREF crBkColor=0xffffffff);
       void SetTextColor(COLORREF crTextColor=0xffffffff);
       COLORREF GetTextColor();
       COLORREF GetBkColor();
 virtual ~CColorStatic();
       // Generated message map functions
protected:
       //{{AFX_MSG(CColorStatic)
      afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
      afx_msg void OnDestroy();
      afx_msg LRESULT OnSetWindowText(WPARAM wParam, LPARAM lParam);
      //}}AFX_MSG
      DECLARE_MESSAGE_MAP()
private:
      bool m_bTransparent;
      CBrush m_brBkgnd;
      COLORREF m_crBkColor;
      COLORREF m_crTextColor;

};
 
// 类的实现文件
// ColorStatic.cpp : implementation file
//
#include "stdafx.h"
#include "ColorStatic.h"
#include "./colorstatic.h"
// CColorStatic
CColorStatic::CColorStatic():CStatic()
{
      // 这里的顺序很重要
      m_crTextColor=::GetSysColor (COLOR_BTNTEXT);
      m_crBkColor=::GetSysColor (COLOR_BTNFACE);
      m_brBkgnd.CreateSolidBrush (m_crBkColor);
      m_bTransparent = true;
}
CColorStatic::~CColorStatic()
{
}
  
BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
      //{{AFX_MSG_MAP(CColorStatic)
      ON_WM_CTLCOLOR_REFLECT()
      ON_WM_DESTROY()
      ON_MESSAGE(WM_SETTEXT,OnSetWindowText)
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()
  
HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
      pDC->SetTextColor (m_crTextColor);
   
     // 如果未调用了SetBkColor成员函数,则背景透明,否则不透明
     if( m_bTransparent)
     {
          // 以下为改进代码,能实现透明的static
           pDC->SetBkMode( TRANSPARENT );
           return (HBRUSH)GetStockObject( NULL_BRUSH );

     }
     else
     {
          pDC->SetBkColor (m_crBkColor);
          return (HBRUSH)m_brBkgnd;

     }
}
   
void CColorStatic::OnDestroy()
{
        CStatic::OnDestroy();
        m_brBkgnd.DeleteObject ();
}
   
/*----------------------------------------
函数名称:COLORREF CColorStatic::GetBkColor()
功    能:取背景顔色
参数说明:无
返 回 值:返回背景顔色
----------------------------------------*/

COLORREF CColorStatic::GetBkColor()
{
       return m_crBkColor;
}
     
/*----------------------------------------
函数名称:COLORREF CColorStatic::GetTextColor()
功    能:取字体顔色。
参数说明:无
返 回 值:返回字体顔色
----------------------------------------*/

COLORREF CColorStatic::GetTextColor()
{
        return m_crTextColor;
}
 
/*----------------------------------------
函数名称:void SetTextColor(COLORREF crTextColor)
功    能:设置字体顔色
参数说明:crTextColor-----顔色变量
----------------------------------------*/

void CColorStatic::SetTextColor(COLORREF crTextColor)
{
      if(crTextColor!=0xffffffff)
      {
           m_crTextColor=crTextColor;
      }
      else
      {
           m_crTextColor=::GetSysColor (COLOR_BTNTEXT);
      }
      Invalidate ();
}
 
/*----------------------------------------
函数名称:void SetBkColor(COLORREF crBkColor)
功    能:设置背景顔色(一旦调用该函数,static不再透明)
参数说明:crBkColor------顔色变量
----------------------------------------*/

void CColorStatic::SetBkColor(COLORREF crBkColor)
{
       m_bTransparent = false;
       if(crBkColor!=0xffffffff)
              m_crBkColor=crBkColor;
       else
             m_crBkColor=::GetSysColor (COLOR_BTNFACE);
       m_brBkgnd.DeleteObject ();
       m_brBkgnd.CreateSolidBrush (m_crBkColor);
       Invalidate ();
}
  
/*----------------------------------------
函数名称:LRESULT OnSetWindowText(WPARAM wParam, LPARAM lParam)
功    能:自定义函数,接收WM_SETTEXT消息并处理
参数说明:
----------------------------------------*/

LRESULT CColorStatic::OnSetWindowText(WPARAM wParam, LPARAM lParam)
{
      if(m_bTransparent)
      {
            // 必须先擦除背景,由于透明的控件没画刷,必须由父窗口来完成
           HWND hWnd = NULL;
           hWnd = GetParent()->GetSafeHwnd();
           ASSERT(hWnd!=NULL);
           CRect rectChild;
           ::GetWindowRect(this->m_hWnd,&rectChild);
          (CWnd::FromHandle(hWnd))->ScreenToClient(&rectChild);
          ::InvalidateRect(hWnd,&rectChild,true);
      }
     return Default();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值