前两天做界面,因为在对话框上贴了一幅图,为了使编辑框,文本框中的文字看起来与对话框浑然一体,我重载了
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出了点小问题,暂时不能使用)你们查查看吧.
到最后,实在没有办法,只好放弃使用编辑框,改用静态文本框显示文字,也算是问题没有解决吧