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

最近在项目中将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);
}
时间: 2024-10-06 04:29:12

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

MFC 加入背景图片并让控件背景透明

/*加入背景图片*/ BOOL CTOOLDlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在此加入消息处理程序代码和/或调用默认值 CDialog::OnEraseBkgnd(pDC); HBITMAP   m_hBitmap; HDC           m_hBkDC; m_hBitmap   =   ::LoadBitmap(::GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BITMAP2)); m_hBkDC     =

C#控件背景透明的几种解决方案

已经很少做winform程序了,最新参与了一个小项目,遇到了控件背景透明的功能要求,特在此总结一下,供有需要的同行参考. 0.背景透明的概念和分类 背景透明是啥意思呢,就是背景透明.哈哈,废话了.其实你想过没有,要求不一样,实现的难道和技术手段也不一样. 最基本的就是不显示控件自己的背景,那,那显示谁的背景? 背景透明后,透过去显示谁,也就是说后面的谁不透明,这是问题的关键,换句话说,透明控件的parent是一个还是多个. 1.简单的背景透明,parent是一个的情况 a.自然透明,如图labe

解决panel或者其他控件叠加时,此控件背景透明,显示的背景色为窗体背景色问题

之前为了图省事儿,直接给Form窗体设置的背景图片,发现这样运行的时候窗体特别的卡顿,于是改为放一个pictureBox控件,由这个控件加载图片后作为背景. 现在卡顿解决了,又出现了另一个问题,运行时,因为panel控件背景色设置的透明,发现它显示的背景色为窗体背景色,而不是pictureBox里面的图片. 就这个问题想了好久,现在找到办法了.将panel下面的控件设置Parent 即可. this.panel1.Parent = this.picturebox1: http://www.cnb

easyUI的列表控件(datagrid)日期列不能正确显示的解决方法

        一.遇见的问题 EasyUI是一套比较轻巧易用的Jquery控件,在EasyUI中,我认为,他的表格 , 做的堪称完美.但是,美中不足的是,在使用过程中遇到一个问题,它的列表控件--datagrid,在显示日期列的时候,由于后台返回给页面的数据是Json格式的,其中的一个日期字段,在后台还是正常的"2012-11-10 12:18:00"这样的格式,到了前台页面就被转换成一个像 /Date(1242357713797+0800)/ 这样的格式.         二.解决

delphi中的Label控件背景透明

Label1.Transparent:=true;你在它的属性窗口把它的Transparent属性改成TRUE就行了 来自为知笔记(Wiz)

VC窗体透明而控件不透明以及Static文本背景透明方法

出自http://my.oschina.net/ypimgt/blog/60951 优点:    1.Dialog 窗体完全透明.     2. 窗体上的控件不透明. DC 绘制的图形不透明.     3. 拖动窗体上用 DC 绘制的图形可以移动窗体. 缺点:     1. 窗体设置透明使用是掩码颜色,所以在窗体上用 DC 绘图的过程当中如果采用了和透明掩码颜色相同的颜色将不会显示出来.     2. 如果将 Border 属性设置成了 NONE ,那么想通过响应 WM_NCHITEST 消息来

VC OnCtlColor函数来修改控件背景颜色

CWnd::OnCtlColor afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); 返回值:OnCtlColor必须返回一个刷子句柄,该刷子将被用于画出控件的背景. 参数: pDC 包含了子窗口的显示设备环境的指针.可能是临时的. PWnd 包含了要求颜色的控件的指针.可能是临时的. NCtlColor 包含了下列值,指定了控件的类型: · CTLCOLOR_BTN 按钮控件 · CTLCOLOR_DLG 对话框

Android给TextView和EditText等控件设置透明背景、圆角边框

第一种方法:在drawable文件夹下新建一个文件设置背景样式 代码: 在drawable文件夹下面新建textviewborder.xml <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#80858

实现控件的透明背景

很多情况下,我们需要控件的背景是透明的,就是要求直接看到控件父窗口的背景颜色.背景位图,比如标签控件.单选Radio控件.复选Check控件,通常都要求在父窗口的背景上进行绘制.然而要求控件的画布透明,这个技术在GDI的文档中没有看到Microsoft作任何说明,当然还是有别的办法. 其一:如果程序支持桌面主题服务的话,则可调用主题服务的API来实现背景.我们先看看这个API: HRESULT DrawThemeParentBackground(HWND hwnd, HDC hdc, RECT