通过映射OnCtlColor消息,而后在改函数中使用pDc->SetBkMode(TRANSPARENT)使Static控件背景透明。
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
if(pWnd->GetDlgCtrlID() == IDC_STATIC_DISPLAY) //IDC_DEVICE_STAT为Static控件的ID
{
pDC->SetTextColor(RGB(0,0,0)); //设置控件字体颜色
pDC->SetBkMode(TRANSPARENT); //设置透明属性
return (HBRUSH)GetStockObject(NULL_BRUSH); //返回空画刷
}
return hbr;
}
通过上面的代码就可以实现static控件透明效果,但是这时候通过SetWindowText()改变static控件的内容时,会出现文字重叠在一起,调用次数越多,重影越严重。
解决重影方法:
方法一:RedrawWindow()
在控件需要改变文字的代码后面加入这个函数即可,如下:
GetDlgItem(IDC_STATIC)->SetWindowText("your string");
GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow();
方法二:局部刷新
void CTestDlg::RefreshControl(UINT uCtlID)
{
Sleep(500);
CRect rc;
GetDlgItem(uCtlID)->GetWindowRect(&rc);
ScreenToClient(&rc);
InvalidateRect(rc);
UpdateWindow(); //一定要加这一句
}
测试过第二种方法,可以解决Static控件背景透明重影问题。