在视图中用一个list中所保存的信息画不现的图标,当滚动视图或改变窗口大小时,这些图标及它们之间的连线闪烁严重。如何解决?

解决方案 »

  1.   

    重载CView::OnEraseBkgnd,函数体内只写一行:return TRUE; 即可搞定
      

  2.   

    重载CView::OnEraseBkgnd,函数体内只写一行:return TRUE; 在OnPaint 中用内存DC
      

  3.   

    如果:重载CView::OnEraseBkgnd,函数体内只写一行:return TRUE;那么,当我扩大当前窗口时,扩大部分将显示拖动的轨迹,显然不合要求.而且滚动后原有的没有被擦去.显示的是一片混乱.而所有显示信息保存在内存中以一幅图的形式。我的上一个版本就是这么做的,但也存在这个问题,而且,我的描画范围可以很大,用图好像也太费内存了.
      

  4.   

    1、用内存位图
    2、取剪裁区,在剪裁区内则重画
    3、背景不重画
    这是普遍采用的方法。
    例:在onpaint中,用以下代码,而在ondraw中则作图 CPaintDC dc(this); // device context for painting
    OnPrepareDC(&dc);

    RECT ClipBox;
    dc.GetClipBox(&ClipBox);
    HDC hDC = dc.GetSafeHdc();
    HDC hMemDC    = ::CreateCompatibleDC(hDC);
    HBITMAP Bitmap = ::CreateCompatibleBitmap(hDC, ClipBox.right - ClipBox.left, 
    ClipBox.bottom - ClipBox.top);
    HBITMAP OldBitmap = (HBITMAP)::SelectObject(hMemDC, Bitmap);
    ::SetWindowOrgEx(hMemDC, ClipBox.left, ClipBox.top, NULL);

    CDC MemDC;
    MemDC.Attach(hMemDC);
    OnDraw(&MemDC); ::BitBlt(hDC, ClipBox.left, ClipBox.top, ClipBox.right - ClipBox.left,
     ClipBox.bottom - ClipBox.top, hMemDC, ClipBox.left, ClipBox.top, SRCCOPY);
    ::SelectObject(hMemDC, OldBitmap);
    ::DeleteObject(Bitmap);
    ::DeleteDC(hMemDC);