The GDI bitmap is just another GDI object, such as a pen or font. You must first create a bitmap and then select it into the device environment. After modifying an object, you must unselect it and delete it.
Even so, there are still some problems because the "bitmap" of the display is actually the display surface image, and the "bitmap" of the printer device is the print page itself. Therefore, bitmap cannot be selected into the display device environment or printer device environment. You must use the CDC: createcompatibledc function to create a special memory device environment for bitmap. Then, use CDC: stretchblt or CDC: bitblt to copy these bits from the memory device environment to the "real" device environment.
Example:
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");}
Display ing mode: mm_text maps each bitmap pixel to a display pixel.
Mm_loenglish: the bitmap size will be 0.54*0.96 inch.
Note: The GDI objects include cbitmap, cbrush, cfont, cpalette, cpen, and crgn.