經過映射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();//能夠防止窗口刷新次數過多 推薦用