(MFC)关于设置static控件背景透明的问题

更新时间:2024-07-07 07:14:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

想要使static控件背景透明,我们需要响应WM_CTLCOLOR消息,重载OnCtlColor函数。内容如下: HBRUSH CteststaticDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{ }

注意,只有返回空画刷才真正的实现了透明,否则还是不透明,如果把返回空画刷的内容注释掉,则出现如下情况:(使用的另一个程序,对话框背景色设置为绿色,方便对比)

HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改DC的任何特性 if(pWnd->GetDlgCtrlID() == IDC_STATIC) { }

// TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr;

pDC->SetTextColor(RGB(255,200,100)); pDC->SetBkMode(TRANSPARENT);

return (HBRUSH)GetStockObject(NULL_BRUSH);

//返回一个空画刷

所以,返回空画刷是必须的。

但是,这样就出现了一个新的问题:,当我们点击一个按钮更新标签上面的文字时,会造成重叠在一起,先看一下效果:

可以通过以下方式使Static控件文本在透明状态下改变时不会产生文本重叠问题: 1、由于Static控件的背景已经是透明的了,那么旧文本应该是画在Static控件的父窗口上的。 2、在给Static控件设置新文本之后(不是之前!)刷新父窗口即可。例如: GetDlgItem(IDC_STATIC_TEST)->SetWindowText(_T(\北京2008\

GetDlgItem(IDC_STATIC_TEST)->GetParent()->RedrawWindow();

IDC_STATIC_TEST为控件ID号。

3、用上面方法刷新的是整个父窗口客户区,界面会闪烁,可以通知父窗口只刷Static控件所在的RECT区域,就不会闪烁了。 CRect rtlbl; GetDlgItem(IDC_STATIC)->GetWindowRect(&rtlbl); ScreenToClient(&rtlbl); //转到客户端界面 InvalidateRect(&rtlbl);//最后刷新对话框背景

本文来源:https://www.bwwdw.com/article/smj.html

Top