在有背景图片的对话框中,static控件的透明显示是一个非常普通的问题。
常用的解决办法可以通过重载OnCtlColor函数设置背景透明,再返回一个空画刷来解决。
[cpp] view plaincopy
01.if(nCtlColor == CTLCOLOR_STATIC )
02.{
03. pDC->SetBkMode(TRANSPARENT);//设置背景透明
04. pDC->SetTextColor(RGB(255,255,0));//设置字体为黄色
05. return (HBRUSH)::GetStockObject(NULL_BRUSH);
06.}
但这种方法有一个弊端:不能动态更新static控件内容,否则输出的文字会重叠。
对于动态更新问题的解决办法就是将控件背后的对话框图片贴到控件上来,这样就可以实现static控件的动态更新了。
下面将详叙通过CTransparentStatic类来实现static控件动态的透明显示的解决方案,其中在CTransparentStatic类的OnPaint函数中实现了动态更新控件背景图片(即将将控件背后的对话框图片贴到控件上来)。lfbjz.codeplex.com
1、在头文件中为static控件增加一个变量(ID为IDC_STATIC_ELAPSETIME ),并使此变量类型为CTransparentStatic,而不是默认的CStatic
[cpp] view plaincopy
01.CTransparentStatic m_staEelapseTime;
2、在对话框的OnInitDialog函数中设置此控件的字体大小和颜色
[cpp] view plaincopy
01.m_staEelapseTime.SetFont(&m_font1);
02.m_staEelapseTime.SetTextColor(RGB(255,255,0)); //黄色
3、在OnCtlColor函数中设置此控件透明和颜色,并返回一个空画刷。
[cpp] view plaincopy
01.if( pWnd ->GetDlgCtrlID() == IDC_STATIC_ELAPSETIME )
02. {
03. pDC->SetBkMode(TRANSPARENT);//设置背景透明
04. pDC->SetTextColor(RGB(255,255,0));//设置字体为黄色
05. return (HBRUSH)::GetStockObject(NULL_BRUSH);
06.
07. }
注意,第三步必须有,否则动态显示staEelapseTime控件内容时,会先绘制windows默认的static控件,造成控件闪烁,自己试一下就知道了。