关闭

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

464人阅读 评论(0) 收藏 举报
 

HTML Tags and JavaScript tutorial



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





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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:150598次
    • 积分:4029
    • 等级:
    • 排名:第7705名
    • 原创:242篇
    • 转载:0篇
    • 译文:0篇
    • 评论:16条
    文章存档
    最新评论