原文链接: 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. Android Studio 打包时 Signature Version 选择 V1 V2 说明

      问题描述(v1和v2) Android 7.0中引入了APK Signature Scheme v2,v1是jar Signature来自JDKV1:应该是通过ZIP条目进行验证,这样APK 签署 ...

  2. LintCode:Fibonacci

    C++ class Solution{ public: /** * @param n: an integer * @return an integer f(n) */ int fibonacci(in ...

  3. 【树莓派】使用VNC进行远程控制

    之前有进行过VNC以及xrdp连接树莓派,并成功了. 这里看到一篇比较新的,基于mac的连接,文章转载收藏,实践可参考. 这一课里我们将学习如何在树莓派上安装和使用VNC.它可以使你通过图形界面的方式 ...

  4. SqlServer2012自增主键跳跃增长的问题解决方案

    1.问题:SqlServer2012自增主键插入几条数据,然后重启服务,然后再插入几条数据,发现重启后插入的记录ID出现跳跃. 2.解决方案: Open SQLServer configuration ...

  5. loadrunner -27492超时

  6. 取某字段不为空的数据is not null

    SELECT * FROM 表名  where  uid='xxx'  and  time  is not null

  7. 解码url参数的lotusscript函数

    在Domino的系统开发过程中,我们往往要通过url来进行传参,传递参数给表单或者代理,假如浏览器请求的url带有参数,在交给服务器前服务器会对其进行编码(不知道这样理解对不对),像一些特殊符号,空格 ...

  8. 这是一篇满载真诚的微信小程序开发干货

    1月9日零点刚过,张小龙与团队正式发布微信小程序.它究竟能在微信8.5亿用户中牵动多少人,现在还很难说.但对于创业者来讲,小程序无疑带来了新契机,以及服务“上帝”们的新方式. 从今天起,只要开发者登录 ...

  9. Android 蓝牙通信——AndroidBluetoothManager

    转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN To get a Git project into your build: Step 1. Add the JitPack repos ...

  10. 【TP3.2.X】linux环境下TP3.2.X的各个目录权限

    1.将整个项目文件 所属设置成www:www,单个文件夹 755 2.Application 单文件夹是755 3.Runtime.Public .Uploads  均是  -R 777