SDI(文档/视图模式)。我用一个函数改变了图像内象素的位置后(函数绝对是正确的),调用Invalidate(),看得到图像是刷新了一下,但是没有期望的变化,根本就没变。
我在OnDraw()中是用以下代码绘图的:
void CBmpDiversifyView::OnDraw(CDC* pDC)
{
CBmpDiversifyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CBitmap* pBitmap = pDoc->GetBitmap ();
        if (pBitmap != NULL) {
        CPalette* pOldPalette;
        CPalette* pPalette = pDoc->GetPalette ();
        if (pPalette != NULL) {
            pOldPalette = pDC->SelectPalette (pPalette, FALSE);
            pDC->RealizePalette ();
        }
        DIBSECTION ds;
        pBitmap->GetObject (sizeof (DIBSECTION), &ds);
        CDC memDC;
        memDC.CreateCompatibleDC (pDC);
        CBitmap* pOldBitmap = memDC.SelectObject (pBitmap);
        pDC->BitBlt (0, 0, ds.dsBm.bmWidth, ds.dsBm.bmHeight, &memDC,
            0, 0, SRCCOPY);
        memDC.SelectObject (pOldBitmap);
        if (pPalette != NULL)
            pDC->SelectPalette (pOldPalette, FALSE);
    }
}
代码应该很好理解,就是先判断是否有bitmap,然后判断有调色板不,接着将位图放入内存,最后用BitBlt显示位图。我想可能是该用其它函数代替BitBlt,不知道到底怎么回事。知道的请回答下,谢谢了!

解决方案 »

  1.   

    有没有别的地方改到了,还有你那个Invalidate是放在哪?一般是不用自己去调用的,只有需要更新的时候才要调用
      

  2.   

    在后面加一条 pDC->UpdateAllViews (NULL);
    ok了
      

  3.   

    不是菜单项,那么就直接在ondraw()最后加:
    pDoc->m_pDib->BuildBitmap();
    pDoc->m_pDib->Display(pDC, 0, 0);
      

  4.   

    m_pDib是CBitmap?那BuildBitmap()又是什么函数?msdn里面都查不到这个函数
      

  5.   

    我觉得是否是bitblt函数不合适,可能用StretchDIBits就可以了。我还没试,等明天再试试