设置控件透明_第1页
设置控件透明_第2页
设置控件透明_第3页
设置控件透明_第4页
设置控件透明_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、设置CEdit控件背景为透明 C+ MFC分类: Windows编程 非发表文章 代码片段2009-02-07 17:30 835人阅读 评论(0) 收藏 举报view plain1. HBRUSH CPenWidthsDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  2.   3.    / Call the 

2、;base class implementation first! Otherwise, it may  4.    / undo what we''re trying to accomplish here.  5.    HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd,

3、60;nCtlColor);  6.   7.    / Are we painting the IDC_MYSTATIC control? We can use  8.    / CWnd:GetDlgCtrlID() to perform the most efficient test.  9.

4、    if (pWnd->GetDlgCtrlID() = IDC_EDIT)  10.      11.       / Set the text color to red  12.       pDC->SetTextColor(RGB(255,

5、60;0, 0);  13.   14.       / Set the background mode for text to transparent   15.       / so background will show thru.  16.

6、       pDC->SetBkMode(TRANSPARENT);  17.   18.       / Return handle to our CBrush object  19.       return (HBRUSH):GetStockObject(NULL_BRUSH

7、);  20.      21.   22.    return hbr;  23.   、MFC中Static控件透明,重影,长度问题 2011-06-10 23:11做MFC编程,Static控件是会经常用到的了,而使Static控件背景透明,以及改变文本的内容、字体、颜色等属性,都是会比较容易碰到的情况。王道做法当然是继承CStatic然后重载OnPaint(),完全自己来画,这样能够获得最大的灵活性,但就是比较麻烦,像

8、我这种比较懒的,就更喜欢用下面的懒方法了。同样创建一个CStatic的派生类,处理父窗口的反射消息WM_CTLCOLOR,即添加HBRUSH CtlColor(CDC *pDC, UINT nCtlColor)这个消息映射函数。注意,不是HBRUSH OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)!我也不知道具体原理,反正我用后者从来没成功过,甚至程序都不会运行到里面。其实还有一个方法,就是处理父窗口的OnCtlColor(),更简单一点,但是不符合封装的原则,所以这里就不提了。C+代码1.HBRUSH CSample:CtlColor(CDC

9、* pDC, UINT nCtlColor)    2.    3.    / TODO:   Change any attributes of the DC here    4.     pDC->SetBkMode(TRANSPARENT);  / 设置透明背景    5.     pDC->SetTextColor(RG

10、B(0, 0, 255);  / 设置文本颜色    6.   7.    / TODO:   Return a non-NULL brush if the parent's handler should not be called    8.    return (HBRUSH)GetStockObject(HOLLOW_BRUSH); / 返回透明画刷    9.  

11、; 通过上述代码,就可以得到彩色的文本以及透明的背景,但是,还存在一个问题,当该Static控件的文本内容或者属性,在运行过程中发生变化的时候,由于背景一直没有擦除(为了实现透明),会出现重影,导致文本模糊成一团。解决方法是,让父窗口进行重绘更新,对,不要看错了,是控件所属的父窗口,而不是控件本身,让控件本身重绘也不会解决问题的,同样我也不太清楚原理。这里还会引出一个问题,如果重绘整个父窗口,由于GDI并不内嵌双缓冲,势必造成严重的闪烁问题,解决办法当然是只让父窗口重绘控件所占的部分,其他部分不进行重绘,代码如下:C+代码1.void CSample:SetText(const TCHAR *

12、pszText)    2.    3.    this->SetWindowText(pszText);    4.   5.     RECT stRect;    6.    / 获取控件位置    7.    this->GetWindowRect(&stRect);&#

13、160;   8.    / 重要!调用父窗口的S2C函数进行坐标转换    9.    this->GetParent()->ScreenToClient(&stRect);    10.    / 重绘控件所在区域,在这里擦除背景    11.    this->GetParent()->InvalidateRect(&st

14、Rect, true);    12.   这样就能够实现动态改变文本属性而不出现重影现象,注意这里调用了父窗口的ScreenToClient()函数来进行坐标的转换,调用控件本身的S2C函数的话,得到的坐标无法用来进行下一步的重绘工作。现在还有一个比较隐蔽的问题,就是文本字符串的长度,如果新的字符串的长度比原来的长,而之前拖放Static控件长度又不足的时候,就会造成超出的部分无法显示,当然你大可以在拖放的时候就尽量弄得长一点,但是如果能随着文本内容而自动调整控件长度,那不是会好得多么。为了实现这样的效果,上面的代码要修改如下:C+代码1.v

15、oid CSample:SetText(const TCHAR *pszText)        2.        3.     CDC *pDC = this->GetDC();        4.    / 获取文本在当前绘图环境下所占的宽度和高度     

16、   5.     CSize clSize = pDC->GetTextExtent(pszText, _tcslen(pszText);        6.       7.     RECT stRect;        8.     &

17、#160;      9.    / 获取控件当前矩形区域        10.    this->GetWindowRect(&stRect);        11.    / 调整宽度为新文本所占宽度        12. 

18、;    stRect.right = stRect.left + clSize.cx;        13.    / 重要!调用父窗口S2C函数转换坐标        14.    this->GetParent()->ScreenToClient(&stRect);      

19、60; 15.    / 调整控件大小以适应新文本        16.    this->MoveWindow(&stRect);        17.       18.    / 重绘控件以避免重影        19.

20、    this->GetWindowRect(&stRect);        20.    this->GetParent()->ScreenToClient(&stRect);        21.    this->GetParent()->InvalidateRect(&stRect, true);

21、60;       22.    同样,这里也是调用父窗口的S2C函数,这样得到的坐标才能正确使用。代码经过上述修改,就实现了控件随文本动态调整宽度的效果。以上只是实现Static背景透明、更改文本颜色以及动态调整控件大小的简单演示,实际的应用中可能还需要考虑很多情况,适当修改代码,但基本原理是不变的。当然要获得最大的灵活性,还是得自己来绘制了 - -最简单的方法是修改完GetDlgItem(IDC_2222)->SetWindowText("好好好");GetDlgItem(I

22、DC_2222)->ShowWindow(SW_HIDE);GetDlgItem(IDC_2222)->ShowWindow(SW_SHOW);BRUSH CMyDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor); switch(pWnd->GetDlgCtrlID() case IDC_STATICC: pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB

23、(0,255,0); return (HBRUSH)GetStockObject(HOLLOW_BRUSH); break; case IDC_STATICA: pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(84,226,95); return (HBRUSH)GetStockObject(HOLLOW_BRUSH); break; case IDC_STATICB: pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(84,226,95); return (HBR

24、USH)GetStockObject(HOLLOW_BRUSH); break; /* case IDC_STATICD: pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(0,255,0); return (HBRUSH)GetStockObject(HOLLOW_BRUSH); break; */ case IDC_EDIT1: pDC->SetTextColor(RGB(0,0,0); break; case IDC_STATICQQQ: pDC->SetBkMode(TRANSPARENT); pDC->

25、SetTextColor(RGB(84,226,95); return (HBRUSH)GetStockObject(HOLLOW_BRUSH); break; return hbr;MFC中设置静态文本的字体颜色、背景透明以及解决字体重叠分类: VC+2010-11-10 10:42 1402人阅读 评论(6) 收藏 举报原创:qsycn 改变static的颜色和设为背景透明可以在父窗口的WM_CTLCOLOR中实现(即HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor))将

26、static设为背景透明时,改变该控件的文本将会出现文字重叠的现象。 其实设置为透明背景也就是在static重画背景时返回一个空的刷子而已,所以你改变文本并没有改变上次残留的背景,从而导致重叠现象。为了解决这个问题,我们可以让父窗口重绘此区域。 以下是我的解决方法:1. 从CStatic继承一个类CStaticEx2. 增加WM_CTLCOLOR的消息反射(把很多事情留给父窗口处理并不是一件推荐的事,就让CStaticEx自己处理这件事,这样还可以不影响到其它的static)3. 处理WM_SETTEXT,当文本改变时,重绘父窗口的该控件所在区域  vi

27、ew plain1. / StaticEx.cpp : implementation file  2. /  3.   4. #include "stdafx.h"  5. #include "StaticEx.h"  6.   7.   8. / CStaticEx  9.   10. IMPLEMENT_

28、DYNAMIC(CStaticEx, CStatic)  11.   12. CStaticEx:CStaticEx()  13.   14.   15.   16.   17. CStaticEx:CStaticEx()  18.   19.   20.   21.   22. BEGIN_MESSAGE_MAP(CStaticEx, 

29、CStatic)  23.  ON_WM_CTLCOLOR_REFLECT()  24. END_MESSAGE_MAP()  25.   26.   27.   28. / CStaticEx message handlers  29.   30.   31.   32. HBRUSH CStaticEx:CtlColor(CDC* p

30、DC, UINT /*nCtlColor*/)  33.   34.  / TODO:  Change any attributes of the DC here  35.  pDC->SetTextColor(RGB(255, 0, 0);/设置文字的颜色     36.     pDC-&

31、gt;SetBkMode(TRANSPARENT);/透明     37.     return (HBRUSH):GetStockObject(NULL_BRUSH);  38.   39.  / TODO:  Return a non-NULL brush if the parent''s handler should

32、 not be called  40.  /return NULL;  41.   42.   43. LRESULT CStaticEx:DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)  44.   45.  / TODO: Add your spe

33、cialized code here and/or call the base class  46.  if(message=WM_SETTEXT)   47.   CRect rect;  48.   GetWindowRect(&rect);  49.   CWnd* pParent = GetParent();&#

34、160; 50.   if(pParent)   51.    pParent->ScreenToClient(&rect);  52.    pParent->InvalidateRect(&rect);  53.     54.    55.   56.  return CStatic:DefWi

35、ndowProc(message, wParam, lParam);  57.    view plain1. / StaticEx.h : header file  2. /  3.   4. #pragma once  5.   6.   7. / CStaticEx  8.   9. class 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论