设置CEdit控件背景为透明C++MFC分类:Windows编程非发表文章代码片段2009-02-0717:30835人阅读评论(0)收藏举报viewplain1.HBRUSHCPenWidthsDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)2.{3.//Callthebaseclassimplementationfirst!Otherwise,itmay4.//undowhatwe''retryingtoaccomplishhere.5.HBRUSHhbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);6.7.//ArewepaintingtheIDC_MYSTATICcontrol?Wecanuse8.//CWnd::GetDlgCtrlID()toperformthemostefficienttest.9.if(pWnd->GetDlgCtrlID()==IDC_EDIT)10.{11.//Setthetextcolortored12.pDC->SetTextColor(RGB(255,0,0));13.14.//Setthebackgroundmodefortexttotransparent15.//sobackgroundwillshowthru.16.pDC->SetBkMode(TRANSPARENT);17.18.//ReturnhandletoourCBrushobject19.return(HBRUSH)::GetStockObject(NULL_BRUSH);20.}21.22.returnhbr;23.}、MFC中Static控件透明,重影,长度问题2011-06-1023:11做MFC编程,Static控件是会经常用到的了,而使Static控件背景透明,以及改变文本的内容、字体、颜色等属性,都是会比较容易碰到的情况。王道做法当然是继承CStatic然后重载OnPaint(),完全自己来画,这样能够获得最大的灵活性,但就是比较麻烦,像我这种比较懒的,就更喜欢用下面的懒方法了。同样创建一个CStatic的派生类,处理父窗口的反射消息WM_CTLCOLOR,即添加HBRUSHCtlColor(CDC*pDC,UINTnCtlColor)这个消息映射函数。注意,不是HBRUSHOnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)!我也不知道具体原理,反正我用后者从来没成功过,甚至程序都不会运行到里面。。。其实还有一个方法,就是处理父窗口的OnCtlColor(),更简单一点,但是不符合封装的原则,所以这里就不提了。C++代码1.HBRUSHCSample::CtlColor(CDC*pDC,UINTnCtlColor)2.{3.//TODO:ChangeanyattributesoftheDChere4.pDC->SetBkMode(TRANSPARENT);//设置透明背景5.pDC->SetTextColor(RGB(0,0,255));//设置文本颜色6.7.//TODO:Returnanon-NULLbrushiftheparent'shandlershouldnotbecalled8.return(HBRUSH)GetStockObject(HOLLOW_BRUSH);//返回透明画刷9.}通过上述代码,就可以得到彩色的文本以及透明的背景,但是,还存在一个问题,当该Static控件的文本内容或者属性,在运行过程中发生变化的时候,由于背景一直没有擦除(为了实现透明),会出现重影,导致文本模糊成一团。解决方法是,让父窗口进行重绘更新,对,不要看错了,是控件所属的父窗口,而不是控件本身,让控件本身重绘也不会解决问题的,同样我也不太清楚原理。。。这里还会引出一个问题,如果重绘整个父窗口,由于GDI并不内嵌双缓冲,势必造成严重的闪烁问题,解决办法当然是只让父窗口重绘控件所占的部分,其他部分不进行重绘,代码如下:C++代码1.voidCSample::SetText(constTCHAR*pszText)2.{3.this->SetWindowText(pszText);4.5.RECTstRect;6.//获取控件位置7.this->GetWindowRect(&stRect);8.//重要!调用父窗口的S2C函数进行坐标转换9.this->GetParent()->ScreenToClient(&stRect);10.//重绘控件所在区域,在这里擦除背景11.this->GetParent()->InvalidateRect(&stRect,true);12.}这样就能够实现动态改变文本属性而不出现重影现象,注意这里调用了父窗口的ScreenToClient()函数来进行坐标的转换,调用控件本身的S2C函数的话,得到的坐标无法用来进行下一步的重绘工作。现在还有一个比较隐蔽的问题,就是文本字符串的长度,如果新的字符串的长度比原来的长,而之前拖放Static控件长度又不足的时候,就会造成超出的部分无法显示,当然你大可以在拖放的时候就尽量弄得长一点,但是如果能随着文本内容而自动调整控件长度,那不是会好得多么。为了实现这样的效果,上面的代码要修改如下:C++代码1.voidCSample::SetText(constTCHAR*pszText)2.{3.CDC*pDC=this->GetDC();4.//获取文本在当前绘图环境下所占的宽度和高度5.CSizeclSize=pDC->GetTextExtent(pszText,_tcslen(pszText));6.7.RECTstRect;8.9.//获取控件当前矩形区域10.this->GetWindowRect(&stRect);11.//调整宽度为新文本所占宽...