码迷,mamicode.com
首页 > 编程语言 > 详细

VC++ CStatic控件背景透明且改变其文本时,文字重叠解决方法

时间:2015-10-26 22:07:30      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

最近在项目中将CStatic控件设置为背景透明且在一个定时器函数改变其文本,结果CStatic的文字重叠了。解决该问题的方案是:从CStatic类派生自己的静态文本控件。

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

为了解决这个问题,我们可以让父窗口重绘该区域,以下是我的解决方法:

1: 从CStatic继承一个类CStaticEx

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

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

代码如下:

  
// StaticEx.h

class CStaticEx : public CStatic
{
 DECLARE_DYNAMIC(CStaticEx)

public:
 CStaticEx();
 virtual ~CStaticEx();

protected:
 DECLARE_MESSAGE_MAP()

 afx_msg HBRUSH CtlColor(CDC* pDC, UINT );

 virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};

// 

 

#include "StaticEx.h"


// StaticEx.cpp

IMPLEMENT_DYNAMIC(CStaticEx, CStatic)

CStaticEx::CStaticEx()
{

}

CStaticEx::~CStaticEx()
{
}


BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

 

// CStaticEx 消息处理程序
HBRUSH CStaticEx::CtlColor(CDC* pDC, UINT )
{
 pDC->SetBkMode(TRANSPARENT);
 pDC->SetTextColor(RGB(255, 0, 0));

 return (HBRUSH)GetStockObject(HOLLOW_BRUSH);

}

 


LRESULT CStaticEx::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
 if(WM_SETTEXT == message)
 {
  CRect rect;
  GetWindowRect(&rect);
  CWnd *pParentWnd = GetParent();
  if(pParentWnd)
  {
   pParentWnd->ScreenToClient(&rect);
   pParentWnd->InvalidateRect(&rect);
  }
 }

 return CStatic::DefWindowProc(message, wParam, lParam);
}

 

VC++ CStatic控件背景透明且改变其文本时,文字重叠解决方法

标签:

原文地址:http://www.cnblogs.com/lujin49/p/4912494.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!