用定时器每1/100秒改变一次文本框的内容,出现闪烁现象,有什么办法可以解决闪烁?

解决方案 »

  1.   

    我试了下没有闪烁 SetTimer(1, 10);不过如果你觉得有闪烁可以把时间再调短点
      

  2.   

    关于闪烁,我曾经详细回答过,实现懒得再打一遍了,可以搜搜我近几个月的贴子。闪烁和刷新的频率没关系,你一秒刷新1万次,该不闪也不闪,如果你绘制的不对,你一秒一次,也会闪,默认的CStatic,你1/100秒重设文本(SetWindowText)是会闪的,解决方案只有一个:重绘CStatic,然后把erase background消息直接return TRUE。然后在OnPaint中TextOut你GetWindowText出来的文字。这样, 你一秒刷新一万次也不会闪。祝你好运。
      

  3.   

    闪烁还有其他问题的, 对于edit。。 第一是你的edit有焦点, 即有光标在里面的, 这样, 每次替换光标又从头开始, 这样必然闪烁。 
    第二就是把你的edit焦点设为父窗体。 
    第三就是重载edit, 在OnEraseBkgnd(CDC* pDC), return true。  这个你可能觉得老套, 但这里还真是必须的。 我用edit做的output窗口 就不会闪烁, 和vs的效果一样, 除了人家不是一直置底。
      

  4.   

    没必要,用两 Timer ,一个负责在后面写数据,不显示,可以1/100秒写一次;一个用于显示,1秒刷新一次(精确到秒),然后停止计时时,把最后的数据直接显示到控件中就可以了
      

  5.   

    重载了EDIT,OnEraseBkgnd(CDC* pDC),return true, 闪烁变得不那么明显,但还是有一点,然后重写OnPaint函数如下,不闪烁了,但为什么使用内存DC输出文本时候,字体设置总是无效??
    void CMyEdit::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    CFont font;
    // 字体
    VERIFY(font.CreateFont(
    78,                        // nHeight
    0,                         // nWidth
    0,                         // nEscapement
    0,                         // nOrientation
    FW_BOLD,    // nWeight
    FALSE,                     // bItalic
    FALSE,                     // bUnderline
    0,                         // cStrikeOut
    ANSI_CHARSET,              // nCharSet
    OUT_DEFAULT_PRECIS,        // nOutPrecision
    CLIP_DEFAULT_PRECIS,       // nClipPrecision
    DEFAULT_QUALITY,           // nQuality
    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
    _T("Arial")));             // lpszFacename CRect rc;//对话框rc 
    ::GetClientRect(this->m_hWnd,&rc); 

    HDC hMemDC = ::CreateCompatibleDC(dc);//建立内存dc 

    HBITMAP hMemBitMap=::CreateCompatibleBitmap( dc, rc.right-rc.left , rc.bottom-rc.top ); 
    ::SelectObject(hMemDC , hMemBitMap); 

    CFont * pOldFont = (CFont *)SelectObject(hMemDC,&font);
    CString strText;
    GetWindowText(strText); ::SetTextColor(hMemDC, RGB(0,255,0));
    ::SetBkColor(hMemDC, RGB(0,0,0));
    ::DrawText(hMemDC,strText, -1, &rc ,DT_CENTER |DT_VCENTER);
    ::SelectObject(hMemDC, pOldFont);

    ::BitBlt(dc,rc.left, rc.top, rc.right-rc.left ,rc.bottom-rc.top ,hMemDC, rc.left, rc.top, SRCCOPY); 

    ::DeleteObject(hMemBitMap); 
    ::DeleteDC(hMemDC); // Do not call CEdit::OnPaint() for painting messages
    }