15,980
社区成员




void Cdicomtest1View::OnDraw(CDC* pDC)
{
Cdicomtest1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rectClient;//客户端矩形
CBitmap bitmapTemp,*pOldBitmap;//定义位图对象
CDC* pMemDC=new CDC;//后备缓冲区
GetClientRect(rectClient);
//建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
bitmapTemp.CreateCompatibleBitmap(pDC, rectClient.Width(), rectClient.Height());
//建立与屏幕显示兼容的后备缓冲区
pMemDC->CreateCompatibleDC(pDC);
//将位图选入到后备缓冲区中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
pOldBitmap=pMemDC->SelectObject(&bitmapTemp);
//先用背景色将位图清除干净,这里我用的是黑作为背景,你也可以用自己应该用的颜色
pMemDC->FillSolidRect(&rectClient, RGB(0,0,0));
//绘图
if(!pDoc->m_pDib->IsEmpty())
pDoc->m_pDib->Display(pMemDC, rectClient, rectClient);
else
pMemDC->TextOutA(50, 50, (CString)"pDoc Empty error");
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0, 0, rectClient.Width(), rectClient.Height(), pMemDC, 0, 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap);
ReleaseDC(pMemDC);
delete pMemDC;
}
BOOL CDib::Display(CDC* pDC, CRect rcDest, CRect rcSrc, DWORD dwRop)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CRect win1;
AfxGetMainWnd()->GetActiveWindow()->GetClientRect(&win1);
int rcDestX=rcDest.Width()/2-GetWidth()/2;
int reDestY=rcDest.Height()/2-GetHeight()/2;
CBitmap* pOldBmp = MemDC.SelectObject(m_pBitmap);
CPalette* pOldPal = pDC->SelectPalette(m_pPalette, TRUE);
pDC->RealizePalette();
BOOL bSuccess = pDC->StretchBlt(rcDestX, reDestY,
rcDest.Width(), rcDest.Height(),
&MemDC,
rcSrc.left, rcSrc.top,
rcSrc.Width(), rcSrc.Height(),
dwRop);
MemDC.SelectObject(pOldBmp);
pDC->SelectPalette(pOldPal, TRUE);
return bSuccess;
}