123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #include "StdAfx.h"
- #include "EasyPrinter.h"
- #include <Shlwapi.h>
- #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);
- }
|