原文链接: http://blog.sina.com.cn/s/blog_4a470fcc01000406.html
这篇文章中有些许错误,不过思路值得借鉴
 
如果在一个有颜色的窗体中创建一个CStatic的对象X,而且该X要改变它的文本内容,那么就有一个X背景是默认窗体背景的问题,而不是那个颜色窗体的背景,这是因为,在SetWindowText时会OnEraseBkgnd擦除X原来的界面的背景,然后调用默认的Onpaint画上window默认的窗体颜色。
 
解决办法有两个:
方法1 
接受ON_WM_CTLCOLOR消息,该消息拦截了画窗体以及窗体上控件的背景颜色的操作
实现如下:
 
HBRUSH CRDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
//CTLCOLOR_STATIC为 CStatic
//CTLCOLOR_EDIT
//CTLCOLOR_LISTBOX
//CTLCOLOR_BTN
//CTLCOLOR_DLG  等等
 
 if ( nCtlColor == CTLCOLOR_STATIC )
 {
  static HBRUSH hbrStatic = ::CreateSolidBrush(RGB(255, 0, 255));
      //COLOR是你想设置的背景颜色 此处必须为静态变量,否则不能实现
  pDC->SetBkColor(RGB(255, 0, 255));
  return hbrStatic ; //返回该刷
 }
 return hbr;
}
 
 
方法2
思路是:创建一个CSatic的类CStaticEx、, 包含一个CDC的成员m_memDC,把窗体的背景作为m_memDC的初始化,在CStaticEx的OnEraseBkgnd内BitBlt m_memDC则,这是X的背景为窗体的背景了
 
// 在OnPaint内初始化m_memDC
void CStaticEx::OnPaint()
{
 static BOOL bFirst = TRUE;
 CFont font;
 VERIFY(font.CreateFont(
    15,                        // nHeight
    0,                         // nWidth
    0,                         // nEscapement
    0,                         // nOrientation
    FW_NORMAL,                 // nWeight
    FALSE,                     // bItalic
    FALSE,                     // bUnderline
    0,                         // cStrikeOut
    DEFAULT_CHARSET,              // nCharSet
    OUT_DEFAULT_PRECIS,        // nOutPrecision
    CLIP_DEFAULT_PRECIS,       // nClipPrecision
    DEFAULT_QUALITY,           // nQuality
    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
    "Arial"));                 // lpszFacename
 CPaintDC dc(this); // device context for painting
 CRect rcStatic, rcParent;
 GetWindowRect(&rcStatic);
 if(bFirst)//这里把父窗口所画的保存起来
 {
  CRect rcStaticInParent;
  bFirst = FALSE;
  CWnd* pParent = GetParent();
  rcStaticInParent = rcStatic;
  pParent->ScreenToClient(&rcStaticInParent);
  
  CDC* pParentDC = pParent->GetDC();
  m_memBp.CreateCompatibleBitmap(&dc, rcStaticInParent.Width(), rcStaticInParent.Height());
  m_memDC.CreateCompatibleDC(&dc);
  m_memDC.SelectObject(m_memBp.GetSafeHandle());
  SYS_DEBUG_OUT(Output_Console,"rcStaticInParent.left=%d; rcStaticInParent.top=%d; rc.bottom=%d;rc.right=%d",rcStaticInParent.left,rcStaticInParent.top,rcStaticInParent.bottom, rcStaticInParent.right);
  
  m_memDC.StretchBlt(0, 0, rcStaticInParent.Width(), rcStaticInParent.Height(), pParentDC, rcStaticInParent.left, rcStaticInParent.top, rcStaticInParent.Width(), rcStaticInParent.Height(),SRCCOPY);
  GetParent()->ReleaseDC(pParentDC);
 }
 
// 写CStatic文本
 CString strWinText;
 GetWindowText(strWinText);
 dc.SelectObject(&font);
 dc.SetTextColor(RGB(255,255,255));
 dc.SetBkMode(TRANSPARENT);
 dc.TextOut(0,0,strWinText);
}
 
BOOL CStaticEx::OnEraseBkgnd(CDC* pDC)
{
  CRect rc;
  GetClientRect(&rc);
  SYS_DEBUG_OUT(Output_Console,"rc.left=%d; rc.top=%d; rc.bottom=%d;rc.right=%d",rc.left,rc.top,rc.bottom, rc.right);
  pDC->BitBlt(0, 0, rc.Width(),rc.Height(), &m_memDC,0, 0 ,SRCCOPY);

return FALSE;

}
 
 
 
 
 

CStatic的透明背景方法的更多相关文章

  1. ie6背景透明的设置方法 ie6背景颜色透明和png图像透明解决方法

    IE6浏览器,让我们又爱又恨.爱它的是,可以让我们写的代码的时候,可以更标准,恨的是,它有太多无厘头的IE6常见bug(详情点击),让我们焦头烂额.现在现在用百度浏览器调查,国内占有率不到6%了,但是 ...

  2. php缩放gif和png格式透明背景变成黑色的解决方法

    在对gif或png格式的图片进行缩放等操作时,原本透明背景的图片最后都变成黑色的,解决办法 $img = imagecreatetruecolor(, ); //2.上色 $color=imageco ...

  3. vc下打印透明背景图片

    一.前言 刚接到个任务,要把带有透明背景的章子图片打印出来,开始觉得不是很简单吗,直接用vc自动生成的打印功能不就ok了.不过问题却不是想像的那么简单! 二.窗口中显示透明图片 在窗口中显示图片,可以 ...

  4. php 处理透明背景的图片时的问题

    PHP图象处理之透明背景的gif和png图片的一些问题 1,直接读取有透明背景的PNG格式文件,然后直接输出,背景变成了黑色,gif则没有这种情况.   解决方法:使用 imagesavealpha ...

  5. (转)解决png图片在IE6下不透明的方法

    来源于:http://xzl52199.blog.163.com/blog/static/95206446201142174540220/ 一.传统的JavaScript方法 思路: 1.一个专门解决 ...

  6. css透明背景兼容方案

    css透明是一个技术活,因为这里面涉及到了IE8及以下版本不兼容opacity这个css3属性,而filter:alpha(opacity=80)这个值则是不兼容IE6.网上比较流行的透明css是这样 ...

  7. MFC 可以设置背景色、字体、字体颜色、透明背景的 Static 静态文本控件

    MFC库里没有符合这个条件的控件,于是我自己写了一个,初步测试有效. 注:可以设置透明背景,但还不能做到透明度设置(如50%透明度) 如果设置了背景色,就不保留透明背景 默认背景色是透明的 [cpp] ...

  8. 使用RGBa和Filter实现不影响子元素的CSS透明背景

    点击查看原文 问题 如果我们想要一个元素拥有半透明的背景,我们有两个选择: 使用CSS和 opacity 做一张 24-bit PNG 背景图片 在CSS中使用opacity有两个问题,一是为了适应所 ...

  9. 关于anroid设置webview背景方法探讨(转)

    最近的项目中一直关于webView设置背景色问题在研究,最终找到了解决的方法. 基于我项目的需求,从服务端传过来的是带有标签的文本,如果使用textView会让整个布局显得很乱,里面的<img ...

随机推荐

  1. 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...

  2. 算法笔记_201:第三届蓝桥杯软件类决赛真题(Java本科)

    目录 1 数量周期 2 提取子串 3 源码变换 4 古代赌局 5 火柴游戏   前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 数量周期 [结果填空](满分9分) 复杂现象背后的推动力,可能是极其简 ...

  3. RSA密钥生成、加密解密、签名验签

    RSA 非对称加密公钥加密,私钥解密 私钥签名,公钥验签 下面是生成随机密钥对: //随机生成密钥对 KeyPairGenerator keyPairGen = null; try { keyPair ...

  4. SUMIF

    SUMIF(range,criteria,sum_range) Range:条件区域,用于条件判断的单元格区域. Criteria:求和条件,由数字.逻辑表达式等组成的判定条件.criteria 参数 ...

  5. python之模块copy,了解概念即可

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块copy,了解概念即可 import copy #浅拷贝 #copy拷贝一个对象,但是对象 ...

  6. Spring Cloud Dalston.SR5 BUG一记

    使用Dalston.SR5版本的Zuul时, 发现Ribbon重试不能切换服务实例, 换成Edgware.SR3,同样的配置可以切换实例进行重试 还有个不升级所有Spring Cloud组件的方法,仅 ...

  7. API返回错误信息的最佳实践

    使用HTTP Status区分不同消息返回 最基础的三个状态200 OK, 400 Client Error, 500 Server Error 这些应该是够的, 如果客户端可以处理更细的划分, 可以 ...

  8. TabLayout自定义tab,实现多样导航栏

    代码地址如下:http://www.demodashi.com/demo/14660.html 前言 之前有讲过TabLayout的一些知识, TabLayout实现顶部导航(一) TabLayout ...

  9. 微信小程序支付源码,后台服务端代码

    作者:尹华南,来自原文地址 微信小程序支付绕坑指南 步骤 A:小程序向服务端发送商品详情.金额.openid B:服务端向微信统一下单 C:服务器收到返回信息二次签名发回给小程序 D:小程序发起支付 ...

  10. 第一个go的web程序;调用七牛云存储的音频api问题解决;条件搜寻文件中的内容,字符串拼接+在上一行

    package main import ( "html/template" "io" "io/ioutil" "log" ...