GDI位图只是另一个GDI对象,例如笔或者字体。你必须先创建一个位图,然后将它选入设备环境。当你完成改对象的操作之后,必须解除对它的选中,并删除它。
尽管如此,仍有一些问题,原因是显示器的“位图”实际上就是显示器表面映像,打印机设备的“位图”是打印页面本身。因此不能将位图选入显示设备环境或者打印机设备环境。必须使用CDC::CreateCompatibleDC 函数为位图创建一个特殊的内存设备环境。然后使用CDC::StretchBlt或者CDC::BitBlt来从内存设备环境中向"真正"的设备环境中复制这些位。
范例:
void CBlat2View::OnDraw(CDC* pDC)
{
CBlat2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// load IDB_BITMAP1 from our resources
CBitmap bmp;
if (bmp.LoadBitmap(IDB_BITMAP1))
{
// Get the size of the bitmap
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
// Create an in-memory DC compatible with the
// display DC we're using to paint
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
// Select the bitmap into the in-memory DC
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
// Find a centerpoint for the bitmap in the client area
CRect rect;
GetClientRect(&rect);
int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2;
// Copy the bits from the in-memory DC into the on-
// screen DC to actually do the painting. Use the centerpoint
// we computed for the target offset.
pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY);
dcMemory.SelectObject(pOldBitmap);
}
else
TRACE0("ERROR: Where's IDB_BITMAP1?\n");
}
显示映射模式:MM_TEXT 每个位图像素将映射为一个显示像素。
MM_LOENGLISH :位图大小将是 0.54*0.96 英寸。
注 GDI对象包括:Cbitmap, CBrush,CFont, CPalette,CPen,CRgn。