關於使用了透明文字背景後,文字不能刷新而重疊在一起的問題

 前兩天做界面,因爲在對話框上貼了一幅圖,爲了使編輯框,文本框中的文字看起來與對話框渾然一體,我重載了

WM_CTLCOLOR,並添加代碼使編輯框,文本框的背景透明,代碼如下:

HBRUSH CTestOutputDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

 CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
 // TODO: Change any attributes of the DC here
 if(nCtlColor==CTLCOLOR_DLG)
 {
  pDC->SetTextColor(RGB(0,0,0));
  pDC->SetBkColor(RGB(100,200,200));
 }

 if(pWnd->GetDlgCtrlID()==IDC_T)
 {
  pDC->SetTextColor(RGB(255,100,100));
  pDC->SetBkMode(TRANSPARENT);
  return *brush;
 }
 else if(nCtlColor==CTLCOLOR_STATIC)
 {
  if(pWnd->GetDlgCtrlID()!=IDC_PICSLIDER)
  {
   pDC->SetTextColor(RGB(255,255,200));
   pDC->SetBkMode(TRANSPARENT);
   return *brush;
  }
 }
 
 return hbr; 
}

後來又在對話框上加上一個計時器,顯示日期和時間,發現數字總是會重疊在一起,到最後變成黑疙瘩.

試了很多方法,後來使用Invalidate,問題算是解決了,但會出現畫面閃爍的問題,看的眼睛疼.

分析原因:

最一般情況下,編輯框,文本框之類的控件要刷新主要辦法是用畫刷覆蓋原來的區域,如果是有顏色的畫刷把原來的文字覆蓋,人們會以爲文字被刪除了,這就是爲什麼很多人告訴我他們的計數器沒有問題的原因.就比如在一張白紙上蓋上另一張白紙,先前的字會看不見,如果在寫着字的透明玻璃上再蓋一個透明玻璃,那會是什麼效果,如果在新玻璃的同一位置寫上不同的文字那又會是什麼效果.

還好,刷新屏幕也是個辦法,但能不能只讓一個屏幕的一塊區域刷新,這樣即使閃爍,也不會那麼明顯.

使用以下代碼

 CRect rect;
 GetDlgItem(IDC_TIME)->GetWindowRect(rect);
 ScreenToClient(rect);
 InvalidateRect(rect);

現在只剩編輯框能刷新了,問題解決.

接下來又遇見一個新問題,我的一個編輯框用來接收數字,按鈕按下後會在編輯框有所顯示,當我按下按鈕使,我發現,先前的計時器模糊了一下然後又恢復,這也算是個問題吧,讓用戶發覺總不太好.

後來想想,應該是Updatedata(FALSE)的問題,以前總認爲Updatedata只會影響一個小區域,現在才知道,它影響的是整個對話框,所以當我按下按鈕並調用Updatedata(FALSE)使編輯框顯示時,會影響到計時器的文本框,讓它提前顯示,現在使用代碼刷新一小塊區域只能解決文字重疊的問題,還沒找到UpdatedataRect這樣的函數,(剛想到要去查,MSDN出了點小問題,暫時不能使用)你們查查看吧.

到最後,實在沒有辦法,只好放棄使用編輯框,改用靜態文本框顯示文字,也算是問題沒有解決吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章