基于对话框的MFC
会连续的使用Invalidate();做清屏处理,这样导致屏幕一直在闪。如何解决?
求代码,新人纠结ing

解决方案 »

  1.   


    就是说我每调用一次Invalidate();函数清屏,屏幕就会闪,如何避免?
      

  2.   


    BOOL CTestDlg::OnEraseBkgnd(CDC* pDC)
    {
    return true;  //禁止刷屏
    }
      

  3.   


    MouseMove里面。
    所以调用很频繁求大神啊
      

  4.   


    MouseMove里面。
    所以调用很频繁求大神啊
      

  5.   


    MouseMove里面。
    所以调用很频繁求大神啊
      

  6.   

    MouseMove里面,那很频繁啊,一般不要调用Invalidate吧
    非要调用,设置一个状态变量,调用一次以后,设置状态为 false,禁止调用。
      

  7.   

    这样肯定会闪啊!处理一下OnEraseBkgnd,直接返回TRUE,不刷新背景试试
      

  8.   

    在MouseMove里面刷新,就算是双缓冲,也死。
    只能设置一个全局状态变量,鼠标进入区域时,Invalidate刷新一次后,设置为false,鼠标出来,再设置为true。bool mousein=true;
    if(PtInRect(&rect,point)) {
        if(mousein) {Invalidate(); mousein=false;}
    }else{
        mousein=true;
    }
      

  9.   

    这个我试过了。还是闪。貌似只能双缓冲,但是我不会。
    ===========
    如果你总是在MouseMove中Invalidate的话,双缓冲作用也不大。
    为什么要在MouseMove中调用Invalidate 呢?
      

  10.   

    没事不要对整个窗口调用Invalidate,哪块需要刷新才Invalidate哪块
      

  11.   


    我的函数如下:
    void CTryDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    ClientToScreen(&point);
    CRect rect;
    GetDlgItem(IDC_STATIC1)->GetClientRect(rect);
    GetDlgItem(IDC_STATIC1)->ClientToScreen(rect);
    if(rect.PtInRect(point)&&Y)   //鼠标是否在控件范围之内
    {

    //将Picture控件中的图片放大一些
                    CDC* pDC=GetDlgItem(IDC_STATIC1)->GetDC();
    CBitmap cbmp;
    cbmp.LoadBitmap(IDB_BITMAP1);

    CDC memdc;
    memdc.CreateCompatibleDC(pDC);
    memdc.SelectObject(&cbmp);

    CRect rect;
    GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect); int width = rect.Width();
    int height = rect.Height(); pDC->StretchBlt(int(-0.05*width),int(-0.05*height),int(width*1.1),int(height*1.1),&memdc,0,0,width,height,SRCCOPY);
    SHUA=true;
    }
    else if(Y&&SHUA)
    //就这里else的情况我不太会了,不会把原来画的放大的那个东西缩小或者擦除,所以只能用了Invalidate();
    {
    Invalidate(SHUA);
    SHUA=false;
    }

    CDialog::OnMouseMove(nFlags, point);
    }这样每次鼠标离开控件的时候会闪一次屏,虽然比以前一直闪好多了,但能否有其他解决方案?
      

  12.   

    //就这里else的情况我不太会了,不会把原来画的放大的那个东西缩小或者擦除,所以只能用了Invalidate();
    =============
    你的图是画在控件中的,就算是调用Invalidate也是对控件调用啊?GetDlgItem(IDC_STATIC1)->Invalidate(..);
      

  13.   

    只能用定时器,因为你在鼠标移动时,就会高频率的调用Invalidate
      

  14.   

    加了GetDlgItem(IDC_STATIC1)->就不能回复原来的大小了
    或者能有其他方法放大picture控件中的图片么?
      

  15.   

    VC2008的话,用 CImage吧,支持所有格式的图片, CImage img1;
    img1.Load(L"D:\\test.jpg");
    img1.Draw(hDC,CRect(10,10,600,600));Draw方法,图片大小可自己定义。
      

  16.   

    建议你将实现函数放到OnEraseBKgnd中,估计可以避免
      

  17.   

    if (wndUnderMouse && wndUnderMouse->m_hWnd == m_hWnd && wndActive)
    {
    if (!m_bMouseOnButton)
    {
    m_bMouseOnButton = TRUE; Invalidate(); csTME.cbSize = sizeof(csTME);
    csTME.dwFlags = TME_LEAVE;
    csTME.hwndTrack = m_hWnd;
    ::_TrackMouseEvent(&csTME);
    } // if
    }
    就算要写,也得加个判断,你说对不?