我在 dailog 上画一条直线,随着  列的拖动而移动,用到Invalidate();  updatewindows 重绘 出现闪烁问题,如何解决?

解决方案 »

  1.   

    ……唉……不要没事儿就 Invalidate() ……你移动一小下,那是无数的  invalidate() 啊……一次 Invalidate,那就是全部推倒重来啊……使用 Onpaint 方法,去画线。画完之后,你就不用管了。
      

  2.   

    说得确切一些,是override 你窗体的 OnPaint 方法,用这个去画线。写法大概是这样的:override OnPaint ( drawContext )
    {
        base.OnPaint(drawContext);
        // 下面是你的画线代码
    }这段只是示例代码,流程就是这样。重写 OnPaint 之后,线就画实了,你就不用再管了。
      

  3.   

    记下线的区域用
    InvalidateRect(&ret);
    擦除上次画的线
      

  4.   

    你可以设置一个缓冲值,当直线每移动了几个像素之后再用Invalidate
      

  5.   

    拖动完再刷新 如何实现双缓冲
    CDC MemDC; //首先定义一个显示设备对象
    Cbitmap MemBitmap; //定义一个位图对象
    //随后建立与屏幕显示兼容的内存显示设备
    MemDC.CreateCompatibleDC(NULL);
    //这时还不能绘图,因为没有地方画 
    //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
    MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
    //将位图选入到内存显示设备中
    //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
    Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);
    //先用背景色将位图清除干净,这里我用的是白色作为背景
    //你也可以用自己应该用的颜色
    MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
    //绘图
    . . . . . .
    . . . . . .
    //将内存中的图拷贝到屏幕上进行显示
    pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
    //绘图完成后的清理
    MemBitmap.DeleteObject();
    MemDC.DeleteDC();
      

  6.   

    楼主需不需要保存所绘制的线条?
    不需要的话根本就没必要调用Invalidate();只需使用GetDC获取窗口的DC
    然后使用该DC绘图就行了。简单
      

  7.   

    除了加双缓冲外,另外如果不需要背景重绘,可以直接给背景消息返回TRUE
      

  8.   

    只需使用GetDC获取窗口的DC 
    然后使用该DC绘图就行了
      

  9.   

    拖动完再刷新 如何实现双缓冲 
    CDC MemDC; //首先定义一个显示设备对象 
    Cbitmap MemBitmap; //定义一个位图对象 
    //随后建立与屏幕显示兼容的内存显示设备 
    MemDC.CreateCompatibleDC(NULL); 
    //这时还不能绘图,因为没有地方画 
    //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 
    MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); 
    //将位图选入到内存显示设备中 
    //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 
    Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); 
    //先用背景色将位图清除干净,这里我用的是白色作为背景 
    //你也可以用自己应该用的颜色 
    MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); 
    //绘图 
    . . . . . . 
    . . . . . . 
    //将内存中的图拷贝到屏幕上进行显示 
    pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); 
    //绘图完成后的清理 
    MemBitmap.DeleteObject(); 
    MemDC.DeleteDC(); 
      

  10.   

    我有个关于双缓冲的问题,因为我使用双缓冲时,老是出现内存不能读的错误,但我双缓冲的代码并没有错误,感觉很奇怪.错误提示dbgheap.c文件,1017行错误
      

  11.   

    拖动完再刷新 如何实现双缓冲 
    CDC MemDC; //首先定义一个显示设备对象 
    Cbitmap MemBitmap; //定义一个位图对象 
    //随后建立与屏幕显示兼容的内存显示设备 
    MemDC.CreateCompatibleDC(NULL); 
    //这时还不能绘图,因为没有地方画 
    //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 
    MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); 
    //将位图选入到内存显示设备中 
    //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 
    Cbitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap); 
    //先用背景色将位图清除干净,这里我用的是白色作为背景 
    //你也可以用自己应该用的颜色 
    MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); 
    //绘图 
    . . . . . . 
    . . . . . . 
    //将内存中的图拷贝到屏幕上进行显示 
    pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); 
    //绘图完成后的清理 
    MemBitmap.DeleteObject(); 
    MemDC.DeleteDC();  这代码放到哪里的 ?