我用dc将一些随时变化的文字信息在OnPaint()里画到面板上,设个定时器
文字的背景色我设置为透明色,然后在OnTimer函数里定时去刷新Invalidate(),
这样可以刷新,但刷新后面板(包括其它的一些按钮什么的)总是闪个不停,
请问各位高手该怎么处理,才能不闪。
void CPlayPane::OnPaint()
{
CString FileName;
CString Curr;
CString Time;
CPaintDC dc(this); 
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* old=memDC.SelectObject(&m_tempBMP);

CRect rc;
this->GetClientRect(&rc);
CBrush br(&m_bkimg); 
memDC.FillRect(&rc,&br);
//int CurrTime,hours,minute,temp,temp2,second;
//CClientDC dc(this);
memDC.SetBkMode(1);
//dc.SetBkColor(RGB(81,54,166));
//dc.SetTextColor(RGB(215,249,9));
memDC.SetTextColor(RGB(255,0,0));
memDC.SetBkMode(0); dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
memDC.SelectObject(old); dc.SetBkMode(1);
dc.TextOut(498,85,"0.0");
dc.TextOut(622,85,"0.25");
dc.TextOut(748,85,"0.5");
dc.TextOut(870,85,"1");    Time=m_pPlayer.TotalTime().c_str();
    dc.TextOut(670,5,Time);
dc.TextOut(660,5,"/");
FileName.Format("%s",m_pPlayer.m_PlayBack->GetFileName().c_str());
    dc.TextOut(110,5,FileName);
Curr=m_pPlayer.CurrTime().c_str();
dc.TextOut(600,5,Curr); dc.SetBkMode(0);
//SetTimer(2,100,NULL);
    // CDC*  pDC;
//ASSERT_VALID(pDC);}
void CPlayPane::OnTimer(UINT nIDEvent)
{

CWnd::UpdateWindow();
//if(nIDEvent==2)
 Invalidate();..........}

解决方案 »

  1.   

    void CPlayPane::OnPaint()
    {
    CString FileName;
    CString Curr;
    CString Time;
    CPaintDC dc(this); 
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CBitmap* old=memDC.SelectObject(&m_tempBMP);

    CRect rc;
    this->GetClientRect(&rc);
    CBrush br(&m_bkimg); 
    memDC.FillRect(&rc,&br);
    memDC.SetBkMode(1);
    memDC.SetTextColor(RGB(255,0,0));
    memDC.SetBkMode(0); memDC.SetBkMode(1);
    memDC.TextOut(498,85,"0.0");
    memDC.TextOut(622,85,"0.25");
    memDC.TextOut(748,85,"0.5");
    memDC.TextOut(870,85,"1");    Time=m_pPlayer.TotalTime().c_str();
        memDC.TextOut(670,5,Time);
    memDC.TextOut(660,5,"/");
    FileName.Format("%s",m_pPlayer.m_PlayBack->GetFileName().c_str());
        memDC.TextOut(110,5,FileName);
    Curr=m_pPlayer.CurrTime().c_str();
    memDC.TextOut(600,5,Curr); memDC.SetBkMode(0);         dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
    memDC.SelectObject(old);
    }
    这样试试呢?
    如果不行,你重载
    BOOL CPlayPane::OnEraseBkgnd(CDC* pDC)
    {
       return TRUE;
    }
      

  2.   

    initdialog中添加一下代码
    //////////////////////////////////////////////////////////////////////////
    // 被子窗口挡住的部分不用重画
    long   style;
    style =  GetWindowLong(m_hWnd,GWL_STYLE);
    style = style | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |WS_MINIMIZEBOX;
    SetWindowLong(m_hWnd,GWL_STYLE,style);
      

  3.   

    不要用Invalidate()
    计算出文字输出区域用InvalidateRect
      

  4.   

    同意healer_kx(甘草(DotNeting)) 4、使用MemoryDC先在内存里把图画好,再复制到屏幕上。  这对于一次画图过程很长的情况比较管用。毕竟内存操作比较快,而且复制到屏幕又是一次性的,至少不会出现可以明显看出一个东东从左画到右的情况。void CMyWin::OnPaint() 
    {
    CPaintDC dc1(this); // device context for painting
    dcMemory.CreateCompatibleDC(&dc1);
    CBitmap bmp;//这里的Bitmap是必须的,否则当心弄出一个大黑块哦。
    bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height());
    dcMemory.SelectObject(&bmp);//接下来你想怎么画就怎么画吧。
    //dcMemory.FillRect(rectClient,&brush); dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY);
    dcMemory.DeleteDC();
    // Do not call CWnd::OnPaint() for painting messages
    }
      

  5.   

    重载OnEraseBkGnd
    {
    return TRUE;
    }
      

  6.   

    大哥们,我这么做了,还是没用噢,
    我创建的是一块播放面板,上面还创建了很多按钮(比如播放按钮等),
    而我在OnPaint() 函数里面用dc画的只是一些文本和背景(按钮没放在这里创建和显示),
    所以一强制刷新,面板上的文字和背景都没有闪(没问题),而是面板上其他的按钮在抖动,关键是怎么解决这个问题。望各位大哥再指点一下,谢谢!!!
      

  7.   

    1先在内存中画图
    2重载OnEraseBkGnd,返回TRUE