关于使用了透明文字背景后,文字不能刷新而重叠在一起的问题

来源:互联网 发布:网络电视 广电总局 编辑:程序博客网 时间:2024/04/29 22:44

 前两天做界面,因为在对话框上贴了一幅图,为了使编辑框,文本框中的文字看起来与对话框浑然一体,我重载了

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出了点小问题,暂时不能使用)你们查查看吧.

到最后,实在没有办法,只好放弃使用编辑框,改用静态文本框显示文字,也算是问题没有解决吧

原创粉丝点击