#include "StdAfx.h" #include "EasyPrinter.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif ULONG CEasyPrinter::m_gdiplusToken = 0; CEasyPrinter::CEasyPrinter(void) { m_nPrintOrientation = 0; m_nOrientationLength = 0; m_pPrintDlg = NULL; m_PrinterDC = NULL; m_strCurPrinterName = _T(""); m_CurPrinterDefaultPaperSize.cx = 0; m_CurPrinterDefaultPaperSize.cy = 0; m_lfDPIX = 0.0; m_lfDPIY = 0.0; m_lf72DPIMul = 0.0; m_pOldfont = NULL; m_hPrinter = NULL; GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); } CEasyPrinter::~CEasyPrinter(void) { Gdiplus::GdiplusShutdown(m_gdiplusToken); } /************************************************************************/ /* 函数:SetTextFont[3/6/2017 Jeff]; /* 描述:设置文本字体; /* 参数:; /* [IN] nTextFontSize:字体大小; /* [IN] bBold:是否粗体; /* [IN] bItalic:是否斜体; /* [IN] strTextFontName:字体名称,如楷体; /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ void CEasyPrinter::SetTextFont(IN INT nTextFontSize, IN BOOL bBold, IN BOOL bItalic, IN TString strTextFontName) { static LOGFONT lf; lf.lfHeight = CALC_FONT_HEIGHT(nTextFontSize); lf.lfWeight = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; if (bBold) lf.lfWeight = FW_BLACK; else lf.lfWeight = FW_NORMAL; lf.lfItalic = bItalic; lf.lfUnderline = FALSE; lf.lfStrikeOut = 0; lf.lfCharSet = ANSI_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_ROMAN; _tcscpy_s(lf.lfFaceName, strTextFontName.c_str()); if (m_cfont.GetSafeHandle()) {// 是否初使用过; if (m_pOldfont) m_dcPrinter.SelectObject(m_pOldfont); m_cfont.DeleteObject(); } // 创建字体; VERIFY(m_cfont.CreateFontIndirect(&lf)); // 选入DC; //SelectObject(m_PrinterDC, &m_cfont); m_pOldfont = m_dcPrinter.SelectObject(&m_cfont); } /************************************************************************/ /* 函数:InitialzePrinter[3/6/2017 Jeff]; /* 描述:初始化打印机; /* 参数:; /* [IN] lpPrinterName:要被初始化的打印机; /* [IN] bShowDlg:是否显示打印机对话框; /* [IN/OUT] :; /* 返回:成功初始化打印返回true; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ BOOL CEasyPrinter::InitialzePrinter(IN LPCTSTR lpPrinterName, IN BOOL bShowDlg) { if (!m_pPrintDlg) delete m_pPrintDlg; // 重新创建打印机; m_pPrintDlg = new CPrintDialog(FALSE, PD_ALLPAGES | PD_NOPAGENUMS, NULL); try { if (lpPrinterName == NULL || lpPrinterName[0] == _T('\0')) {// 如果没有指定打印机,则使用系统默认打印机; if (!m_pPrintDlg->GetDefaults()) { // 获取系统默认打印机失败; return FALSE; } // 获取当前打印机DC环境对象; m_PrinterDC = m_pPrintDlg->GetPrinterDC(); if (m_dcPrinter.Attach(m_PrinterDC) == 0) return FALSE; } else { // 获取当前打印机DC环境对象; m_strCurPrinterName = lpPrinterName; //if ( (m_PrinterDC = CreateDC(NULL, lpPrinterName, NULL, NULL)) == NULL ) if (m_dcPrinter.CreateDC(NULL, lpPrinterName, NULL, NULL) == NULL) { // 获取指定打印机DC环境对象失败; return FALSE; } } } catch (CException* e) { #ifdef _DEBUG e->ReportError(); #endif e->Delete(); } m_dcPrinter.m_bPrinting = TRUE; if (m_pPrintDlg) delete m_pPrintDlg; m_pPrintDlg = NULL; // 获取当前打印机的逻辑像素宽、高; m_CurPrinterDefaultPaperSize.cx = GetDeviceCaps(m_dcPrinter, HORZRES); m_CurPrinterDefaultPaperSize.cy = GetDeviceCaps(m_dcPrinter, VERTRES); // 打印机DPI Pixel per inch m_lfDPIX = GetDeviceCaps(m_dcPrinter, LOGPIXELSX); m_lfDPIY = GetDeviceCaps(m_dcPrinter, LOGPIXELSY); // Pixel per inch m_lf72DPIMul = m_lfDPIY/72.0; WriteTextLog(_T("当前打印机打印机DPI:x=%lf,y=%lf, 分辨率:x=%ld,y=%ld"), m_lfDPIX, m_lfDPIY, m_CurPrinterDefaultPaperSize.cx, m_CurPrinterDefaultPaperSize.cy); return TRUE; } /************************************************************************/ /* 函数:[3/22/2017 Jeff]; /* 描述:; /* 参数:; /* [IN] :; /* [OUT] :; /* [IN/OUT] :; /* 返回:void; /* 注意:; /* 示例:; /* /* 修改:; /* 日期:; /* 内容:; /************************************************************************/ TString CEasyPrinter::GetDefaultPrinter() { return ""; } #ifdef _VER_WINAPI_ BOOL CEasyPrinter::InitPrinter(IN LPCTSTR lpPrinter /* = NULL */) { TString strPrinter = _T(""); if ( lpPrinter != NULL && lpPrinter[0] == '\0') { strPrinter = lpPrinter; } else {// 获取默认打印机; strPrinter = GetDefaultPrinter(); } if ( m_hPrinter ) ClosePrinter(m_hPrinter); if ( !OpenPrinter(strPrinter.c_str(), m_hPrinter, NULL) ) { WriteTextLog(_T("打开打印机失败:%d"), GetLastError()); return FALSE; } DWORD dwBytesReturned = 0, dwBytesNeeded = 0; GetPrinter(m_hPrinter, 2, NULL, 0, &dwBytesNeeded); if ( dwBytesNeeded == 0 ) { return FALSE; } PRINTER_INFO_2 *p2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR, dwBytesNeeded); if ( GetPrinter(m_hPrinter, 2, (LPBYTE)p2, dwBytesNeeded, &dwBytesReturned) == 0 ) { GlobalFree(p2); ClosePrinter(m_hPrinter); WriteTextLog(_T("获取打印机失败:%d"), GetLastError()); return FALSE; } ClosePrinter(m_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); memcpy(pDevMode, p2->pDevMode, sizeof(*p2->pDevMode) + p2->pDevMode->dmDriverExtra); GlobalUnlock(hDevMode); if ( pDevMode->dmFields & DM_ORIENTATION ) { m_PrinterDC = CreateDC(p2->pDriverName, p2->pPrinterName, p2->pPortName, pDevMode); } else { } return TRUE; } #endif BOOL CEasyPrinter::StartPrint() { CString strTitle; // Get the application title DOCINFO di; // Initialise print document details strTitle.LoadString(AFX_IDS_APP_TITLE); ::ZeroMemory(&di, sizeof(DOCINFO)); di.cbSize = sizeof(DOCINFO); di.lpszDocName = strTitle; // Begin a new print job //"winerror.h" #define FAILED(Status) ((HRESULT)(Status)<0) if (m_dcPrinter.StartDoc(&di) <= 0) return FALSE; // Get the printing extents and store in the m_DimDraw fields m_CurPrinterDefaultPaperSize.cx = GetDeviceCaps(m_dcPrinter, HORZRES); m_CurPrinterDefaultPaperSize.cy = GetDeviceCaps(m_dcPrinter, VERTRES); return TRUE; } void CEasyPrinter::EndofPrint() { m_dcPrinter.EndDoc(); m_dcPrinter.Detach(); } BOOL CEasyPrinter::StartPage() { if (m_dcPrinter.StartPage() < 0) return FALSE; return TRUE; } void CEasyPrinter::NewAnPage() { m_dcPrinter.EndPage(); m_dcPrinter.StartPage(); } void CEasyPrinter::EndofPage() { m_dcPrinter.EndPage(); } BOOL CEasyPrinter::LoadTemplateFromJson(IN TString strTemplateJson) { return ::LoadTemplateFromJson(m_printlist, strTemplateJson); } BOOL CEasyPrinter::LoadTemplateFromFile(IN TString strTemplateFile) { return ::LoadTemplateFromFile(m_printlist, strTemplateFile); } void CEasyPrinter::SetPrinter(IN TString strPrinterName) { m_printlist.strPrinterName = strPrinterName; } BOOL CEasyPrinter::LoadValuesFromJson(TString strJsonValues) { return ::LoadValuesFromJson(m_printlist, strJsonValues); } BOOL CEasyPrinter::LoadValuesFromFile(IN TString strJsonFile) { return ::LoadValuesFromFile(m_printlist, strJsonFile); }