zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    mongodb的学习-1-NoSQL
    mongodb的学习-3-在Mac上的安装配置
    面试题之算法与编程
    笔试题之javaweb
    笔试题之j2ee
    笔试题之代码查错
    笔试题之java基础
    javaweb笔记分享
    过滤器入门
    jsp入门
  • 原文地址:https://www.cnblogs.com/lujin49/p/4912494.html
Copyright © 2011-2022 走看看