VC最简版图片打印程序

简介: 自认为注释已经很详细了,没有什么可说的,以后再用的时候如果还有哪不明白的就当长教训了BOOL CMYDlg::PrintPic(CString strFileName,int iCopies,CString strPr...
自认为注释已经很详细了,没有什么可说的,以后再用的时候如果还有哪不明白的就当长教训了 BOOL CMYDlg::PrintPic(CString strFileName,int iCopies,CString strPrintName) { CDC dc; CPrintDialog printDlg(FALSE); HGLOBAL hDevMode; HGLOBAL hDevNames; //以下为判断纸型,m_strPrintSize为类的成员变量 short paperWidth = 0; short paperHeight = 0; if(0==m_strPrintSize.CompareNoCase("a3")) { paperWidth = 2970; paperHeight = 4200; } if(0==m_strPrintSize.CompareNoCase("a4")) { paperWidth = 2100; paperHeight = 2970; } if(0==m_strPrintSize.CompareNoCase("a5")) { paperWidth=1480; paperHeight=2100; } if(0==m_strPrintSize.CompareNoCase("a6")) { paperWidth = 1050; paperHeight = 1480; } BSTR bstr=strFileName.AllocSysString(); Bitmap* pPicture = new Bitmap(bstr); HBITMAP hBitmap;//创建bmp的句柄 pPicture->GetHBITMAP(NULL,&hBitmap);//获取句柄 BITMAP bitmap; ::GetObject(hBitmap,sizeof(BITMAP),&bitmap); printDlg.GetDefaults(); DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(printDlg.m_pd.hDevMode); pDevMode->dmFields = pDevMode->dmFields | DM_PAPERSIZE; pDevMode->dmPaperSize = DMPAPER_USER; //将打印纸设置为自定义DMDO_90 pDevMode->dmPaperWidth = paperWidth; pDevMode->dmPaperLength = paperHeight; // } ::GlobalUnlock(printDlg.m_pd.hDevMode); ::DeleteObject(hBitmap); CPrintInfo Info;// if(GetPrinterDevice(strPrintName.GetBuffer(0), &hDevNames, &hDevMode)) { printDlg.m_pd.hDevMode=hDevMode; printDlg.m_pd.hDevNames = hDevNames; } dc.Attach(printDlg.CreatePrinterDC()); // Attach a printer DC 让HANDLE连接到dc上 dc.m_bPrinting = TRUE; CString strTitle; // Get the application title ? strTitle.LoadString(AFX_IDS_APP_TITLE); DOCINFO di; // Initialise print document details DOCINFO中有相关的打印信息 ::ZeroMemory (&di, sizeof (DOCINFO)); di.cbSize = sizeof (DOCINFO); di.lpszDocName = strFileName;//设置标题 for (int i=0;iRotateFlip(Gdiplus::Rotate90FlipNone); HBITMAP hBitmap;//创建bmp的句柄 pPicture->GetHBITMAP(NULL,&hBitmap);//获取句柄 BITMAP bitmap; ::GetObject(hBitmap,sizeof(BITMAP),&bitmap); double dScale=(double)pInfo->m_rectDraw.Width()/bitmap.bmWidth; //int nScaledWidth=m_cxWidth; int nScaledHeight=(int)(bitmap.bmHeight*dScale); HDC dcMem; dcMem=::CreateCompatibleDC(pDC->m_hDC); HBITMAP hOldBmp=(HBITMAP)::SelectObject(dcMem,hBitmap); CRect r = pInfo->m_rectDraw; SizeToPlace(STP_FIX, r, CRect(0,0,bitmap.bmWidth, bitmap.bmHeight));//这个函数没有给出,可以自己写一下,注释掉也行,功能就是调整尺寸的 int nVertCenterPos = pDC->GetDeviceCaps (VERTRES) / 2; ::StretchBlt(pDC->m_hDC, r.left, r.top, r.Width(), r.Height(), dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); ::SelectObject(dcMem,hOldBmp); ::DeleteDC(dcMem); ::DeleteObject(hBitmap); delete pPicture; pPicture=NULL; } BOOL GetPrinterDevice(LPTSTR pszPrinterName, HGLOBAL* phDevNames, HGLOBAL* phDevMode)//从MSDN复制来的,获取打印机设备 { // if NULL is passed, then assume we are setting app object's // devmode and devnames if (phDevMode == NULL || phDevNames == NULL) return FALSE; // Open printer HANDLE hPrinter; if (OpenPrinter(pszPrinterName, &hPrinter, NULL) == FALSE) return FALSE; // obtain PRINTER_INFO_2 structure and close printer DWORD dwBytesReturned, dwBytesNeeded; GetPrinter(hPrinter, 2, NULL, 0, &dwBytesNeeded); PRINTER_INFO_2* p2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR, dwBytesNeeded); if (GetPrinter(hPrinter, 2, (LPBYTE)p2, dwBytesNeeded, &dwBytesReturned) == 0) { GlobalFree(p2); ClosePrinter(hPrinter); return FALSE; } ClosePrinter(hPrinter); // Allocate a global handle for DEVMODE HGLOBAL hDevMode = GlobalAlloc(GHND, sizeof(*p2->pDevMode) + p2->pDevMode->dmDriverExtra); ASSERT(hDevMode); DEVMODE* pDevMode = (DEVMODE*)GlobalLock(hDevMode); ASSERT(pDevMode); // copy DEVMODE data from PRINTER_INFO_2::pDevMode memcpy(pDevMode, p2->pDevMode, sizeof(*p2->pDevMode) + p2->pDevMode->dmDriverExtra); GlobalUnlock(hDevMode); // Compute size of DEVNAMES structure from PRINTER_INFO_2's data DWORD drvNameLen = lstrlen(p2->pDriverName)+1; // driver name DWORD ptrNameLen = lstrlen(p2->pPrinterName)+1; // printer name DWORD porNameLen = lstrlen(p2->pPortName)+1; // port name // Allocate a global handle big enough to hold DEVNAMES. HGLOBAL hDevNames = GlobalAlloc(GHND, sizeof(DEVNAMES) + (drvNameLen + ptrNameLen + porNameLen)*sizeof(TCHAR)); ASSERT(hDevNames); DEVNAMES* pDevNames = (DEVNAMES*)GlobalLock(hDevNames); ASSERT(pDevNames); // Copy the DEVNAMES information from PRINTER_INFO_2 // tcOffset = TCHAR Offset into structure int tcOffset = sizeof(DEVNAMES)/sizeof(TCHAR); ASSERT(sizeof(DEVNAMES) == tcOffset*sizeof(TCHAR)); pDevNames->wDriverOffset = tcOffset; memcpy((LPTSTR)pDevNames + tcOffset, p2->pDriverName, drvNameLen*sizeof(TCHAR)); tcOffset += drvNameLen; pDevNames->wDeviceOffset = tcOffset; memcpy((LPTSTR)pDevNames + tcOffset, p2->pPrinterName, ptrNameLen*sizeof(TCHAR)); tcOffset += ptrNameLen; pDevNames->wOutputOffset = tcOffset; memcpy((LPTSTR)pDevNames + tcOffset, p2->pPortName, porNameLen*sizeof(TCHAR)); pDevNames->wDefault = 0; GlobalUnlock(hDevNames); GlobalFree(p2); // free PRINTER_INFO_2 // set the new hDevMode and hDevNames *phDevMode = hDevMode; *phDevNames = hDevNames; return TRUE; } 注: 加载头文件winspool.h
目录
相关文章
关于 QtCreator中写Qt程序遇到printf不输出问题 的解决方法
关于 QtCreator中写Qt程序遇到printf不输出问题 的解决方法
|
10月前
|
图形学 C++
Qt实现Qchart的打印和打印预览的几种方法
Qt实现Qchart的打印和打印预览的几种方法
|
Web App开发 XML JSON
程序人生 - 开发程序不写代码,而是靠拼图?
程序人生 - 开发程序不写代码,而是靠拼图?
178 0
程序人生 - 开发程序不写代码,而是靠拼图?
|
存储 程序员 图形学
Win知识 - 程序是怎样跑起来的——文字及图片的显示机制
Win知识 - 程序是怎样跑起来的——文字及图片的显示机制
178 0
Win知识 - 程序是怎样跑起来的——文字及图片的显示机制
Mac系统快速获得文件位置的方法(带图解释)
Mac系统快速获得文件位置的方法(带图解释)
157 0
Mac系统快速获得文件位置的方法(带图解释)
VB源码升级后的几幅截图-VBIDE嵌入窗体、代码资源自动加入
用了整整两天的时间终于完成了功能上的升级,但多国语言版和数据库的加密还不知什么时间能做完,所以一时还不能发布,不过作为“内部人员”倒是可以先用为快:)
527 0
|
C#
用C#开发类似QQ输入法的不规则窗体的程序详解+代码打包分享
QQ窗体是圆角的,Kugoo窗体也是圆角的,QQ的输入法皮肤窗体是不规则的。。。等N多日常使用的程序主窗体都不是四四方方的,其实都是调用2D绘画函数按指定的路径画出来的,那么这一课我给入门级学者讲解的是关于C#实现这一功能。
958 0

热门文章

最新文章