经过映射OnCtlColor消息,然后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与旧文本重叠的现象。
能够经过如下方式使Static控件文本在透明状态下改变时不会产生文本重叠问题:
一、因为Static控件的背景已是透明的了,那么旧文本应该是画在Static控件的父窗口上的。
二、在给Static控件设置新文本以后(不是以前!)刷新父窗口便可。例如:
GetDlgItem(IDC_STATIC_TEST)->SetWindowText(_T("北京2008"));
GetDlgItem(IDC_STATIC_TEST)->GetParent()->RedrawWindow();
IDC_STATIC_TEST为控件ID号。
三、用上面方法刷新的是整个父窗口客户区,界面会闪烁,能够只刷Static控件所在的RECT区域,就不会闪烁了。程序员
我相信不少VC程序员,都用过OnCtlColor来改变控件的底色,字体颜色等。可是static控件改变以后,就会照成控件不刷新的问题。函数
HBRUSH CStadus::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 字体
{ spa
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); .net
// TODO: Change any attributes of the DC here orm
if (nCtlColor == CTLCOLOR_STATIC) blog
{ get
pDC->SetTextColor(RGB(0, 0, 0));//设置成你背景的颜色 string
pDC->SetBkMode(0);//透明 it
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
经过上述代码使static控件实现透明效果,可是这时候经过setWindowText()改变static控件的内容时,会发现出现了文字重叠在一块儿,调用次数越多,重叠越严重,黑成一团。研究了老久,终于找到解决方法。
方法1:RedrawWindow();
在控件须要改变文字的代码后面加入这个函数便可,以下:
GetDlgItem(IDC_STATIC)->SetWindowText("your string");
GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow();
GetDlgItem(IDC_STATIC)->SetWindowText("your string");
GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow();
这个方法比较奏效,可是有时候窗口刷新太频繁,一闪一闪,效果不太好。幸亏有高人指点,能够用局部刷新来实现。
方法2:局部刷新
能够自定义一个函数以下:
void YourDlg::RefreshControl(UINT uCtlID)
{
CRect rc;
GetDlgItem(uCtlID)->GetWindowRect(&rc);
ScreenToClient(&rc);
InvalidateRect(rc);
}
方法3:隐藏和显示
m_BrightStatic.ShowWindow(SW_HIDE);
m_BrightStatic.ShowWindow(SW_SHOW);
void YourDlg::RefreshControl(UINT uCtlID)
{ CRect rc;
GetDlgItem(uCtlID)->GetWindowRect(&rc);
ScreenToClient(&rc); InvalidateRect(rc
方法4 用空白位置填充
SetDlgItemText(IDC_STATIC, " ");//多用几个空格,把原先的文本”冲”掉
SetDlgItemText(IDC_STATIC, "TEST");
方法四:
Redrawwindow();//能够防止窗口刷新次数过多 推荐用