请问一下:我的程序(Dialog-based)设定了背景色,但又要每秒钟更新屏幕一次。
所以我用了InvalidateRect()这个函数。
但是当屏幕更新了后,更新的区域周围会出现长方形黑边。请问如何解决?谢谢!!
程序代码大约如下:
==================================
BOOL CDrawDlg::OnInitDialog() 
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetTimer(0, 1000, NULL); return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}//更新屏幕
void CDrawDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default CRect rect;
//得到屏幕的长和宽
GetClientRect(rect);
rect.top = 0;
rect.bottom = 35; InvalidateRect(rect,TRUE); CDialog::OnTimer(nIDEvent);
}//设定背景色
BOOL CDrawDlg::OnEraseBkgnd(CDC* pDC) 
{
// TODO: Add your message handler code here and/or call default COLORREF green = 0x008000;
CBrush brush (green);
CBrush* pOldBrush = pDC->SelectObject (&brush); 
CRect rcClip ;
pDC->GetClipBox (&rcClip); 
pDC->Rectangle(rcClip);
pDC->SelectObject (pOldBrush); return TRUE; 
}
void CEyeProtectDlg::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here CString str;

//变量i 在header中定义了
str.Format("%d", i++);
dc.TextOut(10, 10, str); // Do not call CDialog::OnPaint() for painting messages
}

解决方案 »

  1.   

    在你的BOOL CDrawDlg::OnEraseBkgnd(CDC* pDC) 
    pDC->Rectangle(rcClip);出的问题。
      

  2.   

    CDrawDlg和CEyeProtectDlg设么关系?
      

  3.   

    我用了this->Invalidate();更新,没有出现问题,用你的方法,上面有一条黑线。
    你试试。
      

  4.   

    谢谢大家!如果是pDC->Rectangle(rcClip)错了,那该怎么改呢?我不想用Invalidate()因为屏幕更新时会闪烁(我要显示的不只这些!)void CEyeProtectDlg::OnPaint()应该改为CDrawDlg::OnPaint()才对。
    因为我写的是保护眼睛的程序,但我发问时改了名字,而这个忘了改。 ^.^;
      

  5.   

    偶的意思是怎么让刷新时屏幕其他部分不闪烁?我现在就遇到了这样一个问题,
    用InvalidateRect设定的Rect好像不管用,还是刷新整个static区域,当然dialog
    其他地方不闪烁