关于Static控件背景透明时文本覆盖重影的问题
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
關(guān)于Static控件背景透明時(shí)文本覆蓋重影的問(wèn)題
??????? 通過(guò)映射OnCtlColor消息,而后在該函數(shù)中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明時(shí)會(huì)出現(xiàn):文本覆蓋重影的問(wèn)題,當(dāng)改變控件的文本就會(huì)發(fā)生新文本與舊文本重疊的現(xiàn)象。?
??????? 可以通過(guò)以下方式使Static控件文本在透明狀態(tài)下改變時(shí)不會(huì)產(chǎn)生文本重疊問(wèn)題:
??????? 1、由于Static控件的背景已經(jīng)是透明的了,那么舊文本應(yīng)該是畫(huà)在Static控件的父窗口上的。
??????? 2、在給Static控件設(shè)置新文本之后(不是之前!)刷新父窗口即可。例如:
??????????????? GetDlgItem(IDC_STATIC_TEST)->SetWindowText(_T("北京2008"));?
??????????????? GetDlgItem(IDC_STATIC_TEST)->GetParent()->RedrawWindow();
??????????????? IDC_STATIC_TEST為控件ID號(hào)。
??????? 3、用上面方法刷新的是整個(gè)父窗口客戶區(qū),界面會(huì)閃爍,可以只刷Static控件所在的RECT區(qū)域,就不會(huì)閃爍了。
? 我相信很多VC程序員,都用過(guò)OnCtlColor來(lái)改變控件的底色,字體顏色等。但是static控件改變之后,就會(huì)照成控件不刷新的問(wèn)題。
HBRUSH CStadus::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) ??
{ ??
???? HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);??????????
?? // TODO: Change any attributes of the DC here ??
?? if (nCtlColor == CTLCOLOR_STATIC) ??
?? { ??
???? pDC->SetTextColor(RGB(0, 0, 0));//設(shè)置成你背景的顏色???
????? pDC->SetBkMode(0);//透明???
??? return (HBRUSH)::GetStockObject(NULL_BRUSH);???
} ??
?? // TODO: Return a different brush if the default is not desired???
???? return hbr;???
}
????通過(guò)上述代碼使static控件實(shí)現(xiàn)透明效果,但是這時(shí)候通過(guò)setWindowText()改變static控件的內(nèi)容時(shí),會(huì)發(fā)現(xiàn)出現(xiàn)了文字重疊在一起,調(diào)用次數(shù)越多,重疊越嚴(yán)重,黑成一團(tuán)。研究了老久,終于找到解決方法。
方法1:RedrawWindow();
在控件需要改變文字的代碼后面加入這個(gè)函數(shù)即可,如下:
GetDlgItem(IDC_STATIC)->SetWindowText("your string"); ??
GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow();??
GetDlgItem(IDC_STATIC)->SetWindowText("your string");
GetDlgItem(IDC_STATIC)->GetParent()->RedrawWindow();
這個(gè)方法比較奏效,但是有時(shí)候窗口刷新太頻繁,一閃一閃,效果不太好。幸好有高人指點(diǎn),可以用局部刷新來(lái)實(shí)現(xiàn)。
方法2:局部刷新
可以自定義一個(gè)函數(shù)如下:
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, "????????");//多用幾個(gè)空格,把原先的文本”沖”掉
SetDlgItemText(IDC_STATIC, "TEST");
方法四:
Redrawwindow();//可以防止窗口刷新次數(shù)過(guò)多 推薦用
?
?
轉(zhuǎn)載于:https://my.oschina.net/ypimgt/blog/61106
總結(jié)
以上是生活随笔為你收集整理的关于Static控件背景透明时文本覆盖重影的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 控件开发中常用属性整理
- 下一篇: 求解最长单调递增子串