C++打印图片的方法

来源:互联网 发布:数据库查询去除重复 编辑:程序博客网 时间:2024/06/15 13:29

方法一: 使用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。
  • 通过使用GetDefaultPrinterGetPrinter函数中的默认打印机数据创建打印机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);