为打印机创建一个新句柄以打印位图文件

时间:2014-10-10 07:19:29

标签: c++ c windows printing gdi+

我正在用visual c ++编写一个DLL库,它有一个功能,其中打印机句柄作为参数传递。此打印机句柄(HDC打印机)用于打印文本文件。现在我想将另一个打印作业(位图文件)发送到同一台打印机。

我们可以创建现有句柄“printer”的另一个句柄副本,我可以使用它来触发新的打印作业。

我尝试过使用PRINTDLG / PRINTDLGEX创建新句柄,但我无法成功

 #include <windows.h>
 #include "stdafx.h"
 #include "ActPlugin.h" //My programs Header file
 #include "stdlib.h"
 #include <stdio.h>
 #include <objidl.h>

 #include "QRGenerator.h" // My program's header file

 #include <gdiplus.h>
 #include <GdiPlusGraphics.h>
 using namespace Gdiplus;
 #pragma comment (lib,"Gdiplus.lib")

 bool GetPrinterDC(HDC *Printer)
 {
     // Display the printer dialog box so the user can select the 
     //  printer and the number of copies to print.
     BOOL            printDlgReturn = FALSE;
     HDC             printerDC = NULL;
     PRINTDLG        printDlgInfo = {0};
     LPWSTR          localPrinterName = NULL;
     PDEVMODE        returnedDevmode = NULL;
     PDEVMODE        localDevmode = NULL;
     int             localNumberOfCopies = 0;

     // Initialize the print dialog box's data structure.
     printDlgInfo.lStructSize = sizeof(printDlgInfo);
     printDlgInfo.Flags =
     // Return a printer device context.
     PD_RETURNDC
     // Don't allow selecting individual document pages to print.
     // Remove this flag if you want to support this feature.
     | PD_NOSELECTION;

     // Display the printer dialog and retrieve the printer DC.
     printDlgReturn = PrintDlg(&printDlgInfo);
     // Check the return value.
     if (TRUE == printDlgReturn)
     {
          // The user clicked OK so the printer dialog box data 
          //  structure was returned with the user's selections.
          //  Copy the relevant data from the data structure and 
          //  save them to a local data structure.

          //
          // Get the HDC of the selected printer
          printerDC = printDlgInfo.hDC;
      }

      if (printerDC != NULL)
      {
           return false;
      }

      printer = &printerDC;

      return true;
}

通过以上功能,我得到了错误

virtual printer sdk\sample\actplugin\c++\actplugin.cpp(154): error C2065: 'PrintDlgEx' : undeclared identifier
1>c:\program files\actmask virtual printer sdk\sample\actplugin\c++\actplugin.cpp(154): error C2146: syntax error : missing ';' before identifier 'printDlgInfo'
1>c:\program files\actmask virtual printer sdk\sample\actplugin\c++\actplugin.cpp(154): error C2065: 'printDlgInfo' : undeclared identifier

如果我将新的printjob提供给现有句柄,则新的打印作业(bmp图像)与现有的文本文件打印重叠。因此,我想为同一台打印机创建一个新的打印作业。

我还检查了“CreateDC”功能,我们需要打印机名称或打印机端口。我实际上希望我的程序是动态的,即在运行时获取打印机。我的DLL将被复制到多个系统,并且应该能够自动检测连接到系统的打印机。 这就是我试图用现有句柄创建一个新的重复句柄的原因。

如果您能为我提供解决此问题的任何意见,我将非常感谢您。 我实际上是处理位图图像和打印机的新手。

由于 Abhinay

修改

正如craig在将“stdafx.h”包含并移动到第一行代码后建议的那样,我能够成功编译并运行该程序。用户现在可以从提示中选择打印机。

我正在构建产品,我不希望我的用户为同一任务选择两次打印机。任何人都可以告诉我,如果我可以使用现有句柄创建新的打印机句柄。

提前致谢。

0 个答案:

没有答案