通过内存画图,当放大到一定程度时,再拖动滚动条显示图像时,总是出现毛刺,但如果用一般的画图方法就不会出现这种情况。这个问题困扰了许久,不知道该怎么解决,望兄弟姐妹们提供帮助!

解决方案 »

  1.   

    作图部分程序如下:
    void CPCBView::OnDraw(CDC* pDC)
    {
    CPCBDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CDC dcMemory;
    CDC* pDrawDC = pDC;
    CBitmap bitmap;
    CBitmap* pOldBitmap;

    // only paint the rect that needs repainting
    CRect client;
    pDC->GetClipBox(client);  //取得逻辑坐标
    CRect rect = client;
    pDC->LPtoDP(&rect);
    rect.NormalizeRect();

    // draw to offscreen bitmap for fast looking repaints
    if (dcMemory.CreateCompatibleDC(pDC))
    {
    if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))
    {
    OnPrepareDC(&dcMemory,NULL);
    pDrawDC = &dcMemory;
    dcMemory.OffsetViewportOrg(-rect.left, -rect.top);
    pOldBitmap = dcMemory.SelectObject(&bitmap);
    dcMemory.SetBrushOrg(rect.left % 8, rect.top % 8);

    // might as well clip to the same rectangle
    dcMemory.IntersectClipRect(client);
    }
    }

    // paint background
    CBrush brush;
    if (!brush.CreateSolidBrush(RGB(0,0,0)))
    {
    return;
    }

    brush.UnrealizeObject();
    pDrawDC->FillRect(client, &brush);

    //绘出PCB版图(彩色)
    pDoc->m_pPCBDesign->Draw(pDrawDC, m_nLayer, TRUE);
    //绘出注释图形
    POSITION pos = m_DrawObjList.GetHeadPosition();
    while (NULL != pos)
    {
    CDrawObj* pObj = m_DrawObjList.GetNext(pos);
    pObj->Draw(pDrawDC);
    }

    if (pDrawDC != pDC)  //drawing in the view
    {
    pDC->SetViewportOrg(0, 0);
    pDC->SetWindowOrg(0,0);
    pDC->SetMapMode(MM_TEXT);
    dcMemory.SetViewportOrg(0, 0);
    dcMemory.SetWindowOrg(0,0);
    dcMemory.SetMapMode(MM_TEXT);
    pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
    &dcMemory, 0, 0, SRCCOPY);
    dcMemory.SelectObject(pOldBitmap);
    }

    CZoomReView::OnDraw(pDC);

    }
      

  2.   

    如果必须在OnDraw时重绘制,就只有考虑一些加速方法了,比如只绘显示区域的对象,
    不过我不喜欢你的代码结构。