方法一: 使用shell执行
保存要打印的文件(可能是C:\),并使用ShellExecute发送打印命令
ShellExecute(0, "print", "C:\\MyImageFile.png", NULL, NULL, SW_SHOWNORMAL);
方法二: 使用打印机设备上下文
1. 初始化打印机DC
2. 在 DC上绘制图像
3.关闭DC。
参考: https://msdn.microsoft.com/en-us/library/dd183521(VS.85).aspx
创建打印机设备上下文
应用程序可以通过几种不同的方式创建打印机DC:
- 通过调用PrintDlg函数显示一个通用对话框,允许用户指定打印机选项,然后使用这些选项创建打印机DC。
- 通过使用GetDefaultPrinter和GetPrinter函数中的默认打印机数据创建打印机DC 。
- 通过使用Win.ini文件中的默认打印机数据创建打印机DC。
注意 不再推荐这种方式。
本节包含演示第二种方法的代码。
TCHAR szDriver [16] = _T(“WINSPOOL”); TCHAR szPrinter [256]; DWORD cchBuffer = 255; HDC hdcPrint = NULL; HANDLE hPrinter = NULL; PRINTER_INFO_2 * pPrinterData; BYTE pdBuffer [16384]; BOOL bReturn = FALSE; DWORD cbBuf = sizeof(pdBuffer); DWORD cbNeeded = 0; pPrinterData =(PRINTER_INFO_2 *)&pdBuffer [0]; //获取默认打印机名称 bReturn = GetDefaultPrinter( szPrinter, &cchBuffer); if(bReturn){ //打开默认打印机 bReturn = OpenPrinter( szPrinter, &hPrinter, 空值); } if(bReturn){ //获取打印机端口名称 bReturn = GetPrinter( hPrinter, 2, &pdBuffer [0], cbBuf, &cbNeeded); //这个句柄不再需要了 ClosePrinter(hPrinter); } if(bReturn){ //创建打印DC hdcPrint = CreateDC(szDriver,szPrinter, pPrinterData-> pPortName,NULL); } if(hdcPrint){ //打印包含该字符串的测试页 //“打印机测试”在左上角。 Escape(hdcPrint,STARTDOC,8,“Test-Doc”,NULL); TextOut(hdcPrint,50,50,_T(“PRINTER TEST”),12); Escape(hdcPrint,NEWFRAME,0,NULL,NULL); Escape(hdcPrint,ENDDOC,0,NULL,NULL); //删除打印机DC。 DeleteDC(hdcPrint); }
本节包含演示最后一个方法的代码。
要使用默认打印机,请从Win.ini文件中检索并解析相应的字符串。该字符串通过调用GetProfileString函数并指定适当的部分和条目名称来检索。在默认打印机的情况下,该数据存储在[windows]部分中,并由名为device的条目标识。Win.ini文件下面摘录的第七行显示了柯达Diconix打印机的条目。
[视窗] 负荷= 运行= 蜂鸣= YES 后台处理程序= YES NullPort =无 设备= Diconix,WINSPOOL,LPT1: CoolSwitch = 1 边框宽度= 3 KeyboardSpeed = 31 InitialKeyboardIndicators = 2 CursorBlinkRate = 530 DoubleClickSpeed = 686 程序= com exe bat pif cmd 文件= DeviceNotSelectedTimeout = 15 TransmissionRetryTimeout = 45 swapdisk = NetWarn = 1 fPromptOnVerbose = FALSE fPromptOnWarning = FALSE fPromptOnError = TRUE fPrintVerbose = FALSE fPrintFileLine = FALSE SHELL = ScreenSaveTimeOut = 300 ScreenSaveActive = 0 DebugOptions = 2048
以下示例显示如何使用Win.ini中的数据创建打印机DC。
HDC hdcPrint; //打印机直流手柄 TCHAR szDevString [120]; //数组为WIN.INI数据 TCHAR * szPrinter,* szDriver; //打印机和驱动程序名称 TCHAR * szPort; //端口名称 TCHAR * nextChar; //检索打印机,打印机驱动程序和 //从WIN.INI输出端口名称。 GetProfileString(_T(“windows”),_T(“device”),_T(“,,,”), szDevString,120); //解析名字串,根据需要设置ptrs //如果字符串包含所需的名称,请使用它们 //创建设备上下文。 if((szPrinter = _tcstok_s(szDevString, _T(“,”),&nextChar)) &&(szDriver = _tcstok_s(NULL, _T(“,”),&nextChar)) &&(szPort = _tcstok_s(NULL, _T(“,”),&nextChar))) { hdcPrint = CreateDC(szDriver,szPrinter, szPort,NULL); } //打印包含该字符串的测试页 //“打印机测试”在左上角。 Escape(hdcPrint,STARTDOC,8,“Test-Doc”,NULL); TextOut(hdcPrint,50,50,_T(“PRINTER TEST”),12); Escape(hdcPrint,NEWFRAME,0,NULL,NULL); Escape(hdcPrint,ENDDOC,0,NULL,NULL); //删除打印机DC。 DeleteDC(hdcPrint);