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,不知道到底怎么回事。知道的请回答下,谢谢了!
我在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,不知道到底怎么回事。知道的请回答下,谢谢了!
ok了
pDoc->m_pDib->BuildBitmap();
pDoc->m_pDib->Display(pDC, 0, 0);