EasyPrinter.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. #include "StdAfx.h"
  2. #include "EasyPrinter.h"
  3. #include <Shlwapi.h>
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #endif
  7. ULONG CEasyPrinter::m_gdiplusToken = 0;
  8. CEasyPrinter::CEasyPrinter(void)
  9. {
  10. m_nPrintOrientation = 0;
  11. m_nOrientationLength = 0;
  12. m_pPrintDlg = NULL;
  13. m_PrinterDC = NULL;
  14. m_strCurPrinterName = _T("");
  15. m_CurPrinterDefaultPaperSize.cx = 0;
  16. m_CurPrinterDefaultPaperSize.cy = 0;
  17. m_lfDPIX = 0.0;
  18. m_lfDPIY = 0.0;
  19. m_lf72DPIMul = 0.0;
  20. m_pOldfont = NULL;
  21. m_hPrinter = NULL;
  22. GdiplusStartupInput gdiplusStartupInput;
  23. GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
  24. }
  25. CEasyPrinter::~CEasyPrinter(void)
  26. {
  27. Gdiplus::GdiplusShutdown(m_gdiplusToken);
  28. }
  29. /************************************************************************/
  30. /* 函数:SetTextFont[3/6/2017 Jeff];
  31. /* 描述:设置文本字体;
  32. /* 参数:;
  33. /* [IN] nTextFontSize:字体大小;
  34. /* [IN] bBold:是否粗体;
  35. /* [IN] bItalic:是否斜体;
  36. /* [IN] strTextFontName:字体名称,如楷体;
  37. /* 返回:void;
  38. /* 注意:;
  39. /* 示例:;
  40. /*
  41. /* 修改:;
  42. /* 日期:;
  43. /* 内容:;
  44. /************************************************************************/
  45. void CEasyPrinter::SetTextFont(IN INT nTextFontSize, IN BOOL bBold, IN BOOL bItalic, IN TString strTextFontName)
  46. {
  47. static LOGFONT lf;
  48. lf.lfHeight = CALC_FONT_HEIGHT(nTextFontSize);
  49. lf.lfWeight = 0;
  50. lf.lfEscapement = 0;
  51. lf.lfOrientation = 0;
  52. if (bBold)
  53. lf.lfWeight = FW_BLACK;
  54. else
  55. lf.lfWeight = FW_NORMAL;
  56. lf.lfItalic = bItalic;
  57. lf.lfUnderline = FALSE;
  58. lf.lfStrikeOut = 0;
  59. lf.lfCharSet = ANSI_CHARSET;
  60. lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
  61. lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  62. lf.lfQuality = DEFAULT_QUALITY;
  63. lf.lfPitchAndFamily = DEFAULT_PITCH | FF_ROMAN;
  64. _tcscpy_s(lf.lfFaceName, strTextFontName.c_str());
  65. if (m_cfont.GetSafeHandle())
  66. {// 是否初使用过;
  67. if (m_pOldfont)
  68. m_dcPrinter.SelectObject(m_pOldfont);
  69. m_cfont.DeleteObject();
  70. }
  71. // 创建字体;
  72. VERIFY(m_cfont.CreateFontIndirect(&lf));
  73. // 选入DC;
  74. //SelectObject(m_PrinterDC, &m_cfont);
  75. m_pOldfont = m_dcPrinter.SelectObject(&m_cfont);
  76. }
  77. /************************************************************************/
  78. /* 函数:InitialzePrinter[3/6/2017 Jeff];
  79. /* 描述:初始化打印机;
  80. /* 参数:;
  81. /* [IN] lpPrinterName:要被初始化的打印机;
  82. /* [IN] bShowDlg:是否显示打印机对话框;
  83. /* [IN/OUT] :;
  84. /* 返回:成功初始化打印返回true;
  85. /* 注意:;
  86. /* 示例:;
  87. /*
  88. /* 修改:;
  89. /* 日期:;
  90. /* 内容:;
  91. /************************************************************************/
  92. BOOL CEasyPrinter::InitialzePrinter(IN LPCTSTR lpPrinterName, IN BOOL bShowDlg)
  93. {
  94. if (!m_pPrintDlg)
  95. delete m_pPrintDlg;
  96. // 重新创建打印机;
  97. m_pPrintDlg = new CPrintDialog(FALSE, PD_ALLPAGES | PD_NOPAGENUMS, NULL);
  98. try
  99. {
  100. if (lpPrinterName == NULL || lpPrinterName[0] == _T('\0'))
  101. {// 如果没有指定打印机,则使用系统默认打印机;
  102. if (!m_pPrintDlg->GetDefaults())
  103. {
  104. // 获取系统默认打印机失败;
  105. return FALSE;
  106. }
  107. // 获取当前打印机DC环境对象;
  108. m_PrinterDC = m_pPrintDlg->GetPrinterDC();
  109. if (m_dcPrinter.Attach(m_PrinterDC) == 0)
  110. return FALSE;
  111. }
  112. else
  113. {
  114. // 获取当前打印机DC环境对象;
  115. m_strCurPrinterName = lpPrinterName;
  116. //if ( (m_PrinterDC = CreateDC(NULL, lpPrinterName, NULL, NULL)) == NULL )
  117. if (m_dcPrinter.CreateDC(NULL, lpPrinterName, NULL, NULL) == NULL)
  118. {
  119. // 获取指定打印机DC环境对象失败;
  120. return FALSE;
  121. }
  122. }
  123. }
  124. catch (CException* e)
  125. {
  126. #ifdef _DEBUG
  127. e->ReportError();
  128. #endif
  129. e->Delete();
  130. }
  131. m_dcPrinter.m_bPrinting = TRUE;
  132. if (m_pPrintDlg)
  133. delete m_pPrintDlg;
  134. m_pPrintDlg = NULL;
  135. // 获取当前打印机的逻辑像素宽、高;
  136. m_CurPrinterDefaultPaperSize.cx = GetDeviceCaps(m_dcPrinter, HORZRES);
  137. m_CurPrinterDefaultPaperSize.cy = GetDeviceCaps(m_dcPrinter, VERTRES);
  138. // 打印机DPI Pixel per inch
  139. m_lfDPIX = GetDeviceCaps(m_dcPrinter, LOGPIXELSX);
  140. m_lfDPIY = GetDeviceCaps(m_dcPrinter, LOGPIXELSY); // Pixel per inch
  141. m_lf72DPIMul = m_lfDPIY/72.0;
  142. WriteTextLog(_T("当前打印机打印机DPI:x=%lf,y=%lf, 分辨率:x=%ld,y=%ld"), m_lfDPIX, m_lfDPIY, m_CurPrinterDefaultPaperSize.cx, m_CurPrinterDefaultPaperSize.cy);
  143. return TRUE;
  144. }
  145. /************************************************************************/
  146. /* 函数:[3/22/2017 Jeff];
  147. /* 描述:;
  148. /* 参数:;
  149. /* [IN] :;
  150. /* [OUT] :;
  151. /* [IN/OUT] :;
  152. /* 返回:void;
  153. /* 注意:;
  154. /* 示例:;
  155. /*
  156. /* 修改:;
  157. /* 日期:;
  158. /* 内容:;
  159. /************************************************************************/
  160. TString CEasyPrinter::GetDefaultPrinter()
  161. {
  162. return "";
  163. }
  164. #ifdef _VER_WINAPI_
  165. BOOL CEasyPrinter::InitPrinter(IN LPCTSTR lpPrinter /* = NULL */)
  166. {
  167. TString strPrinter = _T("");
  168. if ( lpPrinter != NULL && lpPrinter[0] == '\0')
  169. {
  170. strPrinter = lpPrinter;
  171. }
  172. else
  173. {// 获取默认打印机;
  174. strPrinter = GetDefaultPrinter();
  175. }
  176. if ( m_hPrinter )
  177. ClosePrinter(m_hPrinter);
  178. if ( !OpenPrinter(strPrinter.c_str(), m_hPrinter, NULL) )
  179. {
  180. WriteTextLog(_T("打开打印机失败:%d"), GetLastError());
  181. return FALSE;
  182. }
  183. DWORD dwBytesReturned = 0, dwBytesNeeded = 0;
  184. GetPrinter(m_hPrinter, 2, NULL, 0, &dwBytesNeeded);
  185. if ( dwBytesNeeded == 0 )
  186. {
  187. return FALSE;
  188. }
  189. PRINTER_INFO_2 *p2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR, dwBytesNeeded);
  190. if ( GetPrinter(m_hPrinter, 2, (LPBYTE)p2, dwBytesNeeded, &dwBytesReturned) == 0 )
  191. {
  192. GlobalFree(p2);
  193. ClosePrinter(m_hPrinter);
  194. WriteTextLog(_T("获取打印机失败:%d"), GetLastError());
  195. return FALSE;
  196. }
  197. ClosePrinter(m_hPrinter);
  198. // Allocate a global handle for DEVMODE
  199. HGLOBAL hDevMode = GlobalAlloc(GHND, sizeof(*p2->pDevMode) + p2->pDevMode->dmDriverExtra);
  200. // ASSERT(hDevMode);
  201. DEVMODE* pDevMode = (DEVMODE*)GlobalLock(hDevMode);
  202. // ASSERT(pDevMode);
  203. memcpy(pDevMode, p2->pDevMode, sizeof(*p2->pDevMode) + p2->pDevMode->dmDriverExtra);
  204. GlobalUnlock(hDevMode);
  205. if ( pDevMode->dmFields & DM_ORIENTATION )
  206. {
  207. m_PrinterDC = CreateDC(p2->pDriverName, p2->pPrinterName, p2->pPortName, pDevMode);
  208. }
  209. else
  210. {
  211. }
  212. return TRUE;
  213. }
  214. #endif
  215. BOOL CEasyPrinter::StartPrint()
  216. {
  217. CString strTitle; // Get the application title
  218. DOCINFO di; // Initialise print document details
  219. strTitle.LoadString(AFX_IDS_APP_TITLE);
  220. ::ZeroMemory(&di, sizeof(DOCINFO));
  221. di.cbSize = sizeof(DOCINFO);
  222. di.lpszDocName = strTitle;
  223. // Begin a new print job
  224. //"winerror.h" #define FAILED(Status) ((HRESULT)(Status)<0)
  225. if (m_dcPrinter.StartDoc(&di) <= 0)
  226. return FALSE;
  227. // Get the printing extents and store in the m_DimDraw fields
  228. m_CurPrinterDefaultPaperSize.cx = GetDeviceCaps(m_dcPrinter, HORZRES);
  229. m_CurPrinterDefaultPaperSize.cy = GetDeviceCaps(m_dcPrinter, VERTRES);
  230. return TRUE;
  231. }
  232. void CEasyPrinter::EndofPrint()
  233. {
  234. m_dcPrinter.EndDoc();
  235. m_dcPrinter.Detach();
  236. }
  237. BOOL CEasyPrinter::StartPage()
  238. {
  239. if (m_dcPrinter.StartPage() < 0)
  240. return FALSE;
  241. return TRUE;
  242. }
  243. void CEasyPrinter::NewAnPage()
  244. {
  245. m_dcPrinter.EndPage();
  246. m_dcPrinter.StartPage();
  247. }
  248. void CEasyPrinter::EndofPage()
  249. {
  250. m_dcPrinter.EndPage();
  251. }
  252. BOOL CEasyPrinter::LoadTemplateFromJson(IN TString strTemplateJson)
  253. {
  254. return ::LoadTemplateFromJson(m_printlist, strTemplateJson);
  255. }
  256. BOOL CEasyPrinter::LoadTemplateFromFile(IN TString strTemplateFile)
  257. {
  258. return ::LoadTemplateFromFile(m_printlist, strTemplateFile);
  259. }
  260. void CEasyPrinter::SetPrinter(IN TString strPrinterName)
  261. {
  262. m_printlist.strPrinterName = strPrinterName;
  263. }
  264. BOOL CEasyPrinter::LoadValuesFromJson(TString strJsonValues)
  265. {
  266. return ::LoadValuesFromJson(m_printlist, strJsonValues);
  267. }
  268. BOOL CEasyPrinter::LoadValuesFromFile(IN TString strJsonFile)
  269. {
  270. return ::LoadValuesFromFile(m_printlist, strJsonFile);
  271. }