Printing a bitmap

Introduction

Printing a bitmap isn't very difficult to do. I saw several solutions which used creation of DIB sections and quite some code. The trick here is to use the "LoadImage" API which can do that for you. This code uses portions of Chris Maunder's printing article:

Collapse

void PrintBitmap(LPCTSTR filename) {
 CPrintDialog printDlg(FALSE);
 printDlg.GetDefaults();
 // Or get from user:

 // if (printDlg.DoModal() == IDCANCEL)   

 //        return;

 CDC dc;
 if (!dc.Attach(printDlg.GetPrinterDC())) {
  AfxMessageBox(_T("No printer found!")); return;
 }
 
 dc.m_bPrinting = TRUE;
 DOCINFO di;    
 // Initialise print document details

 ::ZeroMemory (&di, sizeof (DOCINFO));
 di.cbSize = sizeof (DOCINFO);
 di.lpszDocName = filename;
 BOOL bPrintingOK = dc.StartDoc(&di); // Begin a new print job

 // Get the printing extents

 // and store in the m_rectDraw field of a

 // CPrintInfo object

 CPrintInfo Info;
 Info.SetMaxPage(1); // just one page

 int maxw = dc.GetDeviceCaps(HORZRES);
 int maxh = dc.GetDeviceCaps(VERTRES);
 Info.m_rectDraw.SetRect(0, 0, maxw, maxh);
 for (UINT page = Info.GetMinPage(); page <=
      Info.GetMaxPage() && bPrintingOK; page++) {
  dc.StartPage();    // begin new page

  Info.m_nCurPage = page;
  CBitmap bitmap;
  // LoadImage does the trick here, it creates a DIB section

  // You can also use a resource here

  // by using MAKEINTRESOURCE() ... etc.

  if(!bitmap.Attach(::LoadImage(
   ::GetModuleHandle(NULL), filename, IMAGE_BITMAP, 0, 0,
   LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE))) {
    AfxMessageBox(_T("Error loading bitmap!")); return;
   }
   BITMAP bm;
   bitmap.GetBitmap(&bm);
   int w = bm.bmWidth;
   int h = bm.bmHeight;
   // create memory device context

   CDC memDC;
   memDC.CreateCompatibleDC(&dc);
   CBitmap *pBmp = memDC.SelectObject(&bitmap);
   memDC.SetMapMode(dc.GetMapMode());
   dc.SetStretchBltMode(HALFTONE);
   // now stretchblt to maximum width on page

   dc.StretchBlt(0, 0, maxw, maxh, &memDC, 0, 0, w, h, SRCCOPY);
   // clean up

   memDC.SelectObject(pBmp);
   bPrintingOK = (dc.EndPage() > 0);   // end page

 }
 if (bPrintingOK)
   dc.EndDoc(); // end a print job

 else dc.AbortDoc();           // abort job.

}

That's all there is to it. Have a nice day!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章