注意我说的是屏幕上的比如我现在整个屏幕都被CWindowDC dc(GetDesktopWindow()) 的DC给FillRect成了   RGB 0,0,255蓝色我想让屏幕刷新我试过 ::InvalidateRect  搞不定。。我是屏幕指定区域刷新哪位大神有方法实现~~~~~~~~~~~~~~

解决方案 »

  1.   

    你得在InvalidateRect(GetDesktopWindow(),...)的同时在你的OnPaint里面继续CWindowDC dc(GetDesktopWindow())、FillRect。
      

  2.   

    LZ放心,凡是刷新重绘肯定得用InvalidateRect
      

  3.   

    还是不行,我把代码贴出来吧// 全局变量
    CWnd *pWnd;
    CRect m_rt;// 填充桌面为蓝色(按钮1事件)
    pWnd = GetDesktopWindow();
    pWnd->GetWindowRect(m_rt); CWindowDC dc(GetDesktopWindow());
    dc.FillRect(m_rt,&CBrush(RGB(0,0,255)));
    ReleaseDC(&dc);// 使用InvalidateRect(按钮2事件)
    InvalidateRect(m_rt,TRUE);// OnPaint中(在CDialog::OnPaint();上面增加的语句)
    CWindowDC dc(GetDesktopWindow());
    dc.FillRect(m_rt,&CBrush(RGB(0,0,255)));
    ReleaseDC(&dc);我这样操作出来的结果还是没有刷新,如果被刷新成功的话,那么屏幕上的m_rt区域蓝色应该都被刷掉。
      

  4.   


    LZ到底是要做什么?把这个区域去掉?用SelectClipRgn吧
      

  5.   

    比如我用CWindowDC dc(GetDesktopWindow())   的DC在屏幕上画了CPoint的曲线画完以后我想擦掉这些线 那么我就要刷新屏幕 ::InvalidteRect(NULL,NULL,TRUE); 刷新一下曲线确实消失了但这是刷新整个屏幕 屏幕会闪烁所以我想只刷新一块区域   
      

  6.   


    明白了。
    沿着这条线的点,以每个点坐标为中心画一个很小的RECT(也可以适当隔几个点画这个RECT,这个RECT可以稍微大一点,这样隔开取的点就少。),然后InvalidteRect这些RECT(循环这个线上的点的RECT),这样就不是刷新整个屏幕,擦了线而且屏幕不会闪。
      

  7.   

    InvalidteRect我不会用  这是实话比如我InvalidteRect(CRect,TRUE);同时在OnPaint中  用CWindowDC的DC来FillRect整个CRect吗
      

  8.   


    不用。InvalidteRect就是擦除你不需要的区域。
      

  9.   

    你的意思是直接  InvalidteRect(CRect,TRUE);??????就行了么
      

  10.   

    你可以把InvalidteRect想象成一块橡皮擦,InvalidteRect(CRect)中的CRect是橡皮擦的大小以及要擦除的区域,如果橡皮小的话擦得慢,但是擦得很准确,而且因为变化的范围很小,不会闪烁。如果大的话擦得快,但是变化的范围大会产生屏幕闪烁。
      

  11.   

    比如擦一条线,如果橡皮很大的话,一次就擦了,但是会闪烁,这就相当于InvalidteRect(NULL, NULL, TRUE)或者Invalidte。如果橡皮小的话,你就得沿着这条线的轨迹擦,但是不会闪烁。就相当于:
    for(遍历这条线)
    {
        InvalidteRect(RECT/*沿着这条线的RECT*/, ...);
    }
      

  12.   

    加一个STATI或图片控件上去,在他们上边DRAW,然后只刷新他们就可以
      

  13.   


    OnMouseMove:
    CWindowDC dc(GetDesktopWindow());
    dc.MoveTo(m_pt);
    dc.LineTo(point);
    ReleaseDC(&dc);
    m_pt = point;
    这是桌面上绘制出来的点
    我在一个按钮中:
    CRect rt;
    rt.SetRect(m_pt.x - 200,m_pt.y - 200,m_pt.x + 200,m_pt.y + 200);
    InvalidateRect(rt,TRUE);
    m_pt是OnMouseMove中最后一个点的位置,这里将他扩大200个像素使用了 InvalidateRect(rt,TRUE);
    没有任何效果
    OnPaint中我没做处理不知道我这是哪错了,这个你能举例写一下整个InvalidteRect怎么写吗。。
      

  14.   

    InvalidateRect(rt,TRUE);
    应该是
    ::InvalidateRect(GetDesktopWindow(),rt,TRUE);
    吧。
    而且你得确保你画的线的坐标在rt区域范围内。
      

  15.   

    不行。我都写成 CRect rt;
    rt.SetRect(m_pt.x - 1200,m_pt.y - 1200,m_pt.x + 1200,m_pt.y + 1200);
    ::InvalidateRect(GetDesktopWindow()->m_hWnd,rt,TRUE);了刷新不了
      

  16.   


    那就有可能是你的rt的范围有问题。rt的值你不能随便写,像m_pt.x - 1200这种肯定不行,还不如rt.left=0;rt.right=0。最好计算好rt的范围,不要随便写。
      

  17.   

    而且InvalidateRect后,不能有OnMouseMove消息,不然又会画另一条线。
      

  18.   

    rt.SetRect(0,0,1366,768);
    ::InvalidateRect(GetDesktopWindow()->m_hWnd,rt,TRUE);还是不行杯具啊杯具
    1366 768是我屏幕大小
      

  19.   

    哥们可以和你QQ聊么。。我干脆把DEMO工程发你   你看呢