MFC打印位图 (BMP)

 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. 
}  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值