前兩天做界面,因爲在對話框上貼了一幅圖,爲了使編輯框,文本框中的文字看起來與對話框渾然一體,我重載了
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出了點小問題,暫時不能使用)你們查查看吧.
到最後,實在沒有辦法,只好放棄使用編輯框,改用靜態文本框顯示文字,也算是問題沒有解決吧