關於Static控件背景透明時文本覆蓋重影的問題

關於Static控件背景透明時文本覆蓋重影的問題


        經過映射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控件的內容時,會發現出現了文字重疊在一塊兒,調用次數越多,重疊越嚴重,黑成一團。研究了老久,終於找到解決方法。

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

相關文章
相關標籤/搜索