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(, , )); 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控件背景透明且改变其文本时,文字重叠解决方法的更多相关文章
- MFC解决Static控件背景透明时文本覆盖重影
通过映射OnCtlColor消息,而后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与 ...
- C#控件背景透明的几种解决方案
已经很少做winform程序了,最新参与了一个小项目,遇到了控件背景透明的功能要求,特在此总结一下,供有需要的同行参考. 0.背景透明的概念和分类 背景透明是啥意思呢,就是背景透明.哈哈,废话了.其实 ...
- MFC 添加背景图片并让控件背景透明
/*添加背景图片*/ BOOL CTOOLDlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDialog::OnEraseBkg ...
- MFC 加入背景图片并让控件背景透明
/*加入背景图片*/ BOOL CTOOLDlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在此加入消息处理程序代码和/或调用默认值 CDialog::OnEraseB ...
- winform控件背景透明问题(label..等)
在使用winform写界面的时候,要想label这种控件实现对背景色透明,并且也懒得每次拖动一次控件都要在后台写一遍label1.Parent=PictureBox1 那么下面方法就介绍了比较简单便捷 ...
- C#ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决方法
在使用ComboBox控件时,遇到了重新绑定赋值出问题的情况.正常情况下,对于数据重新赋值的或者绑定数据源的时候,为了防止数据出现问题,都会先清空原来数据,所以就这样写了,但是没有相当恰恰这样写就出现 ...
- delphi中的Label控件背景透明
Label1.Transparent:=true;你在它的属性窗口把它的Transparent属性改成TRUE就行了 来自为知笔记(Wiz)
- delphi 控件背景透明代码
procedure DrawParentBackground(Control: TControl; DC: HDC; R: PRect = nil; bDrawErasebkgnd: Boolean ...
- .NET中TextBox控件设置ReadOnly=true后台取不到值的解决方法
在.NET 2.0 下,当页面上的某个TextBox 设置了属性ReadOnly="True"时,通过客户端脚本给其赋值后,在后台代码中访问其Text属性却无法获得该值.经过尝试, ...
随机推荐
- json 与jsonp 特点及区别
简单描述JSON跟JSONP的区别以及实战 什么是JSON? 前面简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,你是否该选用他首先肯定要关注它所拥有的优点. JSON的优点 ...
- UVA 494 Kindergarten Counting Game
题目大意:输入一个字字符串,输出该字符串中所包含的"word"个数,其中"word"是指连续的字母(大小写均可) 题目思路:其实这是道水题,不过我考虑的时候,太 ...
- mysql新建表示,时间字段timetamp碰到的问题
在mysql中创建表时,在新加的字段时间上,碰到下面的问题: 建表语句如下: CREATE TABLE seckill( seckill_id bigint NOT NULL AUTO_INCREME ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- php连接数据库、创建数据库、创建数据表
<?php $con = mysql_connect("localhost", "root", "root"); if(!$con){ ...
- 使用wcf服务捕捉到“POST http://yourIP/WCFService.svc 405 (Method Not Allowed) ”错误!
在程序中使用了一个wcf服务,调试时无任何问题(win7 64位,iis6.1),发布到部门服务器上没有问题(server2008 64位),但是部署到实际服务器上时(server2008 iis6. ...
- JS-改变页面的颜色之变化核心-获取六位的随机数
前言:从JS-改变页面的颜色(一).JS-改变页面的颜色(二).JS-改变页面的颜色(三)三个简单的小白例,我们可以轻而易举的看到起变化的核心是——十六进制颜色值的获取方式,所以,我们这里总结一下获取 ...
- 傻瓜式操作Nagios
傻瓜式操作Nagios 不少接触Nagios的朋友都会觉得安装配置困难,应用在企业网中所花费的时间成本很高,下面通过OSSIM来搞定它把. 为了节省资源,首先在淘汰的机器上安装一个低版本的OSSI ...
- ruby on rails 在centos 7下的安装配置
因为想安装最新版本,所以通过编译安装. 安装前准备工具和库文件: sudo yum install gcc gcc-c++ openssl-devel readline-devel gdbm-deve ...
- css内容样式属性
设置元素的最大高度.最小高度.最大宽度.最小宽度,用max-height.min-height.max-width.min-width. visibility:设置元素是否可见.visible和hid ...