自己写了一个基于对话框的秒表程序,为了让时间在刷新时,不出现闪烁现象,使用了双缓冲来显示时间,但是遇到了一个问题就是:如果秒表正常运行没问题,但当暂停程序后,程序一刷新(当对话框被其他的程序遮住后,再显示对话框),对话框上的界面就回到了初始化时的界面上去了。不知道哪位高手能指点一下,如何让对话框再刷新之后,还是显示秒表暂停时的时间?????
这是程序显示的主要代码:
strTime = strHour+":"+strMinutes+":"+strSecond+":"+strMillsecond;
pMain->m_strCurTime = strTime; pMain->m_dcMem.DrawText(strTime, pMain->m_rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);//将显示时间数字写到内存
pMain->m_pDC->BitBlt(0, 0, pMain->m_rect.right, pMain->m_rect.bottom, &pMain->m_dcMem, 0, 0, SRCCOPY);    //从内存中拷贝到DC中

解决方案 »

  1.   

    把绘制的操作放到 OnPaint中,定时器那里就调用时间更改,再用InvalidateRect来进行刷新 
      

  2.   

    怎么实现重绘,在OnPaint里面吗?
      

  3.   

    if (iSMill < 10)
    {
    strMillsecond.Format("00%d",iSMill);
    }
    else if (iSMill < 100)
    {
    strMillsecond.Format("0%d",iSMill);
    }
    else
    {
    strMillsecond.Format("%d",iSMill);
    }
    //秒的显示
    if (iSec < 10)
    {
    strSecond.Format("0%d",iSec);
    }
    else
    {
    strSecond.Format("%d",iSec);
    }
    //分钟的显示
    if (iMin < 10)
    {
    strMinutes.Format("0%d",iMin);

    else
    {
    strMinutes.Format("%d",iMin);
    }
    //小时的显示
    if ((int)iHour%100 < 10)
    {
    strHour.Format("0%d",iHour);
    }
    else
    {
    strHour.Format("%d",iHour);
    } strTime = strHour+":"+strMinutes+":"+strSecond+":"+strMillsecond;
    pMain->m_strCurTime = strTime; pMain->m_dcMem.DrawText(strTime, pMain->m_rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);//将显示时间数字写到内存
    pMain->m_pDC->BitBlt(0, 0, pMain->m_rect.right, pMain->m_rect.bottom, &pMain->m_dcMem, 0, 0, SRCCOPY);    //从内存中拷贝到DC中
    这是显示,楼上的仁兄可否具体说一下怎么在OnPaint中绘制,谢谢
      

  4.   

    你好,在这里不能发图片,我在百度空间里发了图片http://hi.baidu.com/wjl_river/blog/item/301191aa1106b11d4a36d68f.html楼上的老大给看看是如何弄
      

  5.   

    先试试:把
    pMain->m_dcMem.DrawText(strTime, pMain->m_rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//
    改成m_pDC->DrawText(strTime, pMain->m_rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//(语句放在BitBlt后)
    如果还不能满足,再说
      

  6.   

    不用那么麻烦 你只需要加一个消息就好了 背景消息知道吗?
    我给你找找 你的问题只是你用的缓冲更新问题,窗口失去焦点在获得焦点的时候没有刷新就会显示初始界面信息丢失,刷新一下就好了。 ON_WM_ERASEBKGND()BOOL CThreadRenderDlg::OnEraseBkgnd(CDC *pDC)
    {
       Invalidate(FALSE);
       UpdateWindow();
       return TRUE;
    }不要返回父类消息。
      

  7.   

    我在程序里怎么找不到WM_ERASEBKGND消息啊,我是基于对话框的程序
      

  8.   

    先试试:把
    pMain->m_dcMem.DrawText(strTime, pMain->m_rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//
    改成m_pDC->DrawText(strTime, pMain->m_rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//(语句放在BitBlt后)
    如果还不能满足,再说
    你是将文字写到DDB上了,应该写在DIB,至于DDB和DIB自己翻书吧!!!!
      

  9.   

    自己写个类继承自CStatic,在onctlcolor中将背景设置为透明的SetBKMode(TRANSPARENT),然后定时器中SetWindowText就好了,这个我曾经做过,就是这样弄得,效果相当好。你可以直接在网上找一个继承CStatic的类就可以了