日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于Static控件背景透明时文本覆盖重影的问题

發布時間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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控件的內容時,會發現出現了文字重疊在一起,調用次數越多,重疊越嚴重,黑成一團。研究了老久,終于找到解決方法。

方法1RedrawWindow();

在控件需要改變文字的代碼后面加入這個函數即可,如下:

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控件背景透明时文本覆盖重影的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。