关闭

MFC中设置文本的颜色

标签: mfc
540人阅读 评论(0) 收藏 举报
分类:

改变static的颜色和设为背景透明可以在父窗口的WM_CTLCOLOR中实现(即HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor))

将static设为背景透明时,改变该控件的文本将会出现文字重叠的现象。

 

其实设置为透明背景也就是在static重画背景时返回一个空的刷子而已,所以你改变文本并没有改变上次残留的背景,从而导致重叠现象。

为了解决这个问题,我们可以让父窗口重绘此区域。

 

以下是我的解决方法:

1. 从CStatic继承一个类CStaticEx

2. 增加WM_CTLCOLOR的消息反射(把很多事情留给父窗口处理并不是一件推荐的事,就让CStaticEx自己处理这件事,这样还可以不影响到其它的static)

3. 处理WM_SETTEXT,当文本改变时,重绘父窗口的该控件所在区域

  1. // StaticEx.cpp : implementation file  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "StaticEx.h"  
  6.   
  7.   
  8. // CStaticEx  
  9.   
  10. IMPLEMENT_DYNAMIC(CStaticEx, CStatic)  
  11.   
  12. CStaticEx::CStaticEx()  
  13. {  
  14.   
  15. }  
  16.   
  17. CStaticEx::~CStaticEx()  
  18. {  
  19. }  
  20.   
  21.   
  22. BEGIN_MESSAGE_MAP(CStaticEx, CStatic)  
  23.  ON_WM_CTLCOLOR_REFLECT()  
  24. END_MESSAGE_MAP()  
  25.   
  26.   
  27.   
  28. // CStaticEx message handlers  
  29.   
  30.   
  31.   
  32. HBRUSH CStaticEx::CtlColor(CDC* pDC, UINT /*nCtlColor*/)  
  33. {  
  34.  // TODO:  Change any attributes of the DC here  
  35.  pDC->SetTextColor(RGB(255, 0, 0));//设置文字的颜色     
  36.     pDC->SetBkMode(TRANSPARENT);//设置透明     
  37.     return (HBRUSH)::GetStockObject(NULL_BRUSH);  
  38.   
  39.  // TODO:  Return a non-NULL brush if the parent's handler should not be called  
  40.  //return NULL;  
  41. }  
  42.   
  43. LRESULT CStaticEx::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
  44. {  
  45.  // TODO: Add your specialized code here and/or call the base class  
  46.  if(message==WM_SETTEXT) {  
  47.   CRect rect;  
  48.   GetWindowRect(&rect);  
  49.   CWnd* pParent = GetParent();  
  50.   if(pParent) {  
  51.    pParent->ScreenToClient(&rect);  
  52.    pParent->InvalidateRect(&rect);  
  53.   }  
  54.  }  
  55.   
  56.  return CStatic::DefWindowProc(message, wParam, lParam);  
  57. }  

 

  1. // StaticEx.h : header file  
  2. //  
  3.   
  4. #pragma once  
  5.   
  6.   
  7. // CStaticEx  
  8.   
  9. class CStaticEx : public CStatic  
  10. {  
  11.     DECLARE_DYNAMIC(CStaticEx)  
  12.   
  13. public:  
  14.     CStaticEx();  
  15.     virtual ~CStaticEx();  
  16.   
  17. protected:  
  18.     virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);  
  19.   
  20. protected:  
  21.     DECLARE_MESSAGE_MAP()  
  22.     afx_msg HBRUSH CtlColor(CDC* pDC, UINT /*nCtlColor*/);  
  23. };  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:156681次
    • 积分:3334
    • 等级:
    • 排名:第10117名
    • 原创:177篇
    • 转载:24篇
    • 译文:2篇
    • 评论:19条
    最新评论