VC++ CStatic控件背景透明且改变其文本时,文字重叠解决方法
2015-10-26 21:27
501 查看
最近在项目中将CStatic控件设置为背景透明且在一个定时器函数改变其文本,结果CStatic的文字重叠了。解决该问题的方案是:从CStatic类派生自己的静态文本控件。
其实设置背景透明,也就是在CStatic重画时,返回一个空刷子而已,所以改变文本并没有改变上次残留的背景,从而导致重叠现象。
为了解决这个问题,我们可以让父窗口重绘该区域,以下是我的解决方法:
1: 从CStatic继承一个类CStaticEx
2: 增加WM_CTLCOLOR消息反射(把很多事情留给父窗口窗口处理不是一件很好的事,就让CStaticEx自己处理,这样还可以不影响到其他的Static)
3:处理WM_SETTEXT,当文本改变时,重绘父窗口的该控件所在的区域。
代码如下:
// StaticEx.h
#include "StaticEx.h"
// StaticEx.cpp
其实设置背景透明,也就是在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); }
相关文章推荐
- C++ stl map的基本操作和使用
- C++:运算符重载函数
- C语言使用正则表达式
- C语言中的变量
- C++:基类与派生类对象之间的赋值兼容关系
- C++:虚基类
- C++学习笔录3
- C语言读写二进制流
- C语言实现栈
- 【C语言】【面试题】5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果问题
- C++字符数组的定义与初始化
- C语言—常见的内存分配函数
- C++:多重继承
- C语言中的常量
- C语言之算法初步(汉诺塔--递归算法)
- 黑马程序员****C语言基础****C语言的基本概念
- 顶层const与底层const
- C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)
- 【C语言】编写一个程序统计输入字符串中: 各个数字、空白字符、以及其他所有字符出现的次数。
- 【C语言】【笔试题】编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。