关于Static控件背景透明时文本覆盖重影的问题
2019獨角獸企業重金招聘Python工程師標準>>>
關于Static控件背景透明時文本覆蓋重影的問題
??????? 通過映射OnCtlColor消息,而后在該函數中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明時會出現:文本覆蓋重影的問題,當改變控件的文本就會發生新文本與舊文本重疊的現象。?
??????? 可以通過以下方式使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區域,就不會閃爍了。
? 我相信很多VC程序員,都用過OnCtlColor來改變控件的底色,字體顏色等。但是static控件改變之后,就會照成控件不刷新的問題。
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));//設置成你背景的顏色???
????? pDC->SetBkMode(0);//透明???
??? 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();//可以防止窗口刷新次數過多 推薦用
?
?
轉載于:https://my.oschina.net/ypimgt/blog/61106
總結
以上是生活随笔為你收集整理的关于Static控件背景透明时文本覆盖重影的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 控件开发中常用属性整理
- 下一篇: 求解最长单调递增子串