Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1676289
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2009-07-15 09:43:57

可改变颜色的文本,可实现透明文本 收藏
首先有个问题必须弄明白:
消息反射——允许控件在给父窗口发送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();
}
阅读(1061) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~