CEdit 字体颜色

下例中,m_edit是一个文本框对象(属于对话框成员)。  
   
  HBRUSH   CTestDlg::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)    
  {  
          HBRUSH   hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);  
   
          //   TODO:   Change   any   attributes   of   the   DC   here  
          if(pWnd   ==   &m_edit)  
          {  
                  pDC->SetBkMode(TRANSPARENT);  
                  pDC->SetTextColor(RGB(0,0,255));  
                  HBRUSH     newHbr   =   CreateSolidBrush(GetSysColor(COLOR_BTNFACE));  
                  //   TODO:   Return   a   different   brush   if   the   default   is   not   desired  
                  return   newHbr;  
          }  
          return   hbr;  
  }  
   
          另外也可以从CEdit派生一个类,重载它的OnPaint函数。

 

 

 

从软件工程的角度来讲,最好是从CEdit类派生出一个可以自己处理字体、背景和字体颜色的类。而根据你的要求,最快的实现方法便是利用MFC独特的消息反射机制,让edit控件自己完成颜色的设置。  
      我们知道,当控件要重画时,一般会向自己的父类发送一个WM_CTLCOLOR(andygood兄,你把该消息的名字都搞错了,不是WM_CTRLCOLOR:),要求父类提供一个DC来完成重绘.按andygood的方法,如果对话框上有20个edit   control的话,你岂不是要针对每一个控件去判断和处理吗?何不让这些edit控件自己知道怎么重画呢?所以,我们可以利用一种高级的MFC技术--消息反射(Message   Reflection)来完成.所谓消息反射是指将控件发给父类的一些通知消息再返回给控件本身,让控件自己处理.可以反射的消息有很多,除了WM_CTLCOLOR外,还有WM_NOTIFY,WM_DRAWITEM等等,我们可以利用消息反射实现一个可以自定义颜色和字体的类,一劳永逸,把它放在VC的Components   Gallery里随时使用了.  
      下面是如何操作:  
      1.   在你的工程中新建一个类,即打开ClassWizard,点Add   Class,然后选New,新类从CEdit派生,就叫它CColorEdit吧.点OK,CColorEdit类即被加入到你的项目中.  
      2.切换到Class   View视图,在CColorEdit上点右键,然后选"Add   Windows   Message   Handler",在弹出的对话框中可以看到很多可以处理的消息.注意了没有,其中有一个消息为"=WM_CTLCOLOR",前面加的'='号表示它是一个反射的消息.选中这条消息,点Add   handler,再点OK,Classwizard自动为你完成消息映射.  
      3.你的CColorEdit类会有一个HBRUSH   CColorEdit::CtlColor(CDC*   pDC,   UINT   nCtlColor)   的成员函数.你可以为该类声明两个成员变量,分别表示前景色和背景色.既然你有了重绘的pDC,剩下的代码就和andygood兄所提供的差不多了.  
      完成后,你只要指定edit控件的前景色和背景色,其他的事情,它自己会做了,也不必劳烦父类了.  
   
      总之,善于使用消息反射的话,有时可以使你事半功倍.

 

 

 

 

/*===========================================================================  
  ====                                                                                                                                           ====  
  ====         File   name                       :     EditTrans.h                                                               ====  
  ====         Creation   date               :     7/10/2001                                                                   ====  
  ====         Author(s)                       :     Dany   Cantin                                                               ====  
  ====                                                                                                                                           ====  
  ===========================================================================*/  
   
  #ifndef   EDITTRANS_H  
  #define   EDITTRANS_H  
   
  #if   _MSC_VER   >   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >   1000  
   
   
  /  
  //   CEditTrans   window  
   
  #define   TRANS_BACK   -1  
   
  class   CEditTrans   :   public   CEdit  
  {  
  //   Construction  
  public:  
  CEditTrans();  
   
  //   Attributes  
  private:  
          COLORREF   m_TextColor;  
          COLORREF   m_BackColor;  
          CBrush       m_Brush;  
   
  //   Operations  
  public:  
          void   SetTextColor(COLORREF   col)   {   m_TextColor   =   col;  
                                                                              UpdateCtrl();             }  
          void   SetBackColor(COLORREF   col)   {   m_BackColor   =   col;  
                                                                              UpdateCtrl();             }  
  private:  
          void   UpdateCtrl();  
   
  //   Overrides  
  //   ClassWizard   generated   virtual   function   overrides  
  //{{AFX_VIRTUAL(CEditTrans)  
  //}}AFX_VIRTUAL  
   
  //   Implementation  
  public:  
  virtual   ~CEditTrans();  
   
  //   Generated   message   map   functions  
  protected:  
  //{{AFX_MSG(CEditTrans)  
  afx_msg   HBRUSH   CtlColor(CDC*   pDC,   UINT   nCtlColor);  
  afx_msg   void   OnUpdate();  
  afx_msg   void   OnLButtonDown(UINT   nFlags,   CPoint   point);  
  afx_msg   void   OnKillfocus();  
  //}}AFX_MSG  
   
  DECLARE_MESSAGE_MAP()  
  };  
   
   
  #endif   //   EDITTRANS_H  

 

/*===========================================================================  
  ====                                                                                                                                           ====  
  ====         File   name                       :     EditTrans.cpp                                                           ====  
  ====         Creation   date               :     7/10/2001                                                                   ====  
  ====         Author(s)                       :     Dany   Cantin                                                               ====  
  ====                                                                                                                                           ====  
  ===========================================================================*/  
   
  #include   "stdafx.h"  
  #include   "EditTrans.h"  
   
  #ifdef   _DEBUG  
  #define   new   DEBUG_NEW  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]   =   __FILE__;  
  #endif  
   
  /  
  //   CEditTrans  
   
  CEditTrans::CEditTrans()  
  {  
          m_TextColor   =   RGB(0,   0,   0);  
          m_BackColor   =   TRANS_BACK;  
  }  
   
  CEditTrans::~CEditTrans()  
  {  
  }  
   
   
  BEGIN_MESSAGE_MAP(CEditTrans,   CEdit)  
  //{{AFX_MSG_MAP(CEditTrans)  
  ON_WM_CTLCOLOR_REFLECT()  
  ON_CONTROL_REFLECT(EN_UPDATE,   OnUpdate)  
  ON_WM_LBUTTONDOWN()  
  ON_CONTROL_REFLECT(EN_KILLFOCUS,   OnKillfocus)  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
  /  
  //   CEditTrans   message   handlers  
   
  HBRUSH   CEditTrans::CtlColor(CDC*   pDC,   UINT   nCtlColor)    
  {  
          m_Brush.DeleteObject();  
   
          if   (m_BackColor   ==   TRANS_BACK)    
  {  
                  m_Brush.CreateStockObject(HOLLOW_BRUSH);  
                  pDC->SetBkMode(TRANSPARENT);  
          }  
          else  
  {  
                  m_Brush.CreateSolidBrush(m_BackColor);  
                  pDC->SetBkColor(m_BackColor);  
          }  
   
          pDC->SetTextColor(m_TextColor);  
   
  LOGBRUSH   lb1;  
  lb1.lbStyle   =   BS_HOLLOW;  
  lb1.lbColor   =   RGB(192,224,255);  
   
  HBRUSH   hBrush1   =   CreateBrushIndirect(&lb1);  
          return   hBrush1;  
  }  
   
   
  void   CEditTrans::OnKillfocus()    
  {  
          UpdateCtrl();  
  }  
   
   
  void   CEditTrans::OnUpdate()    
  {  
          UpdateCtrl();  
  }  
   
   
  void   CEditTrans::OnLButtonDown(UINT   nFlags,   CPoint   point)    
  {  
          UpdateCtrl();  
           
          CEdit::OnLButtonDown(nFlags,   point);  
  }  
   
   
  void   CEditTrans::UpdateCtrl()  
  {  
          CWnd*   pParent   =   GetParent();  
          CRect   rect;  
           
          GetWindowRect(rect);  
          pParent->ScreenToClient(rect);  
          rect.DeflateRect(2,   2);  
           
          pParent->InvalidateRect(rect,   FALSE);          
  }   
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值