打印指定的BMP文件到打印机

3
我遇到了一个对我来说非常陌生的问题:打印到打印机上。通过搜索互联网,我找到了一种方法可以将文本打印到我的打印机上,但只能是简单的文本。请参见以下内容:
#include <stdio.h>
#include <windows.h>
#include <string.h>

int main () 
{
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];

// get the default printer name
bReturn = GetDefaultPrinter(
    szPrinter,
    &cchBuffer);

if (bReturn) {
    // open the default printer
    bReturn = OpenPrinter(
        szPrinter,
        &hPrinter,
        NULL);
}

if (bReturn) {
    // get the printer port name
    bReturn =  GetPrinter(
        hPrinter,
        2,
        &pdBuffer[0],
        cbBuf,
        &cbNeeded);

       // this handle is no longer needed
    ClosePrinter(hPrinter);
}

if (bReturn) {
   // create the Print DC
   hdcPrint = CreateDC(szDriver, szPrinter, 
        pPrinterData->pPortName, NULL); 
}

if (hdcPrint) {
    // Print a test page that contains the string  
    // "PRINTER TEST" in the upper left corner.  

    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); 

    // Delete the printer DC.  
    DeleteDC(hdcPrint); 
}

这可以成功地将“PRINTER TEXT”打印到我的打印机上。我想要的是如何指定一个BMP文件路径,然后打印该BMP文件。虽然我在谷歌上找到了一些信息,但所有的努力都没有任何成果。感谢任何帮助。

当前更新:

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <string.h>

int main () 
{
TCHAR   szDriver[16] = _T("WINSPOOL");
TCHAR   szPrinter[256];
DWORD   cchBuffer = 255;
HDC     hdcPrint = NULL;
HDC     hdcPrintImg = 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];

// get the default printer name
bReturn = GetDefaultPrinter(
    szPrinter,
    &cchBuffer);

if (bReturn) {
    // open the default printer
    bReturn = OpenPrinter(
        szPrinter,
        &hPrinter,
        NULL);
}

if (bReturn) {
    // get the printer port name
    bReturn =  GetPrinter(
        hPrinter,
        2,
        &pdBuffer[0],
        cbBuf,
        &cbNeeded);

       // this handle is no longer needed
    ClosePrinter(hPrinter);
}

if (bReturn) {
    // create the Print DC
    HBITMAP bmp = (HBITMAP)LoadImage(0, L"print_file.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    HBITMAP CreatCompatibleBitmap(bmp);
    hdcPrintImg = bmp;
    hdcPrint = CreateDC(szDriver, szPrinter, 
        pPrinterData->pPortName, NULL); 
}

if (hdcPrint) {
    // Print a test page that contains the string  
    // "PRINTER TEST" in the upper left corner.  
    //Escape(hdcPrint, STARTDOC, 8, "Test-Doc", NULL); 
    //TextOut(hdcPrint, 50, 50, _T("PRINTER TEST"), 12); 
    BitBlt(hdcPrint, 0, 0, 3300, 2550, hdcPrintImg, 0, 0, SRCCOPY);
    //Escape(hdcPrint, NEWFRAME, 0, NULL, NULL); 
    //Escape(hdcPrint, ENDDOC, 0, NULL, NULL); 

    // Delete the printer DC.  
    DeleteDC(hdcPrint); 
}

}

1个回答

2

打印到打印机与打印到屏幕并没有太大的区别。您已经处理了所有与打印机不同的“东西”。

您的hdcPrint基本上只是普通DC的普通句柄。您可以将BMP打印到它上面,就像在屏幕上显示BMP一样:

  1. 加载BMP
  2. 创建与目标DC兼容的DC
  3. 将该BMP选择到兼容的DC中
  4. 从兼容的DC向打印机的DC进行位块传输。

最大的区别在于,屏幕通常具有约100 DPI,而打印机通常至少具有300 DPI。因此,大小适合屏幕的图片通常在打印机上看起来微不足道。根据其尺寸,打印到打印机时可能需要将图片放大。

附带说明:还有一些不兼容位块传输的打印机。在编写数据之前,您可能需要使用GetDeviceCaps(RC_BITBLT)GetDeviceCaps(RC_STRETCHBLT)。曾经经常遇到这种情况,但我很久没有见过了。


谢谢你的回复,Jerry。不幸的是,我觉得我在这里已经超出了我的能力范围。我理解你所写的内容,但我对如何实现它毫无头绪。我想第一步就是一个巨大的任务,所以我怀疑你很难给我展示一个例子。对于所有这些,我可能是一个无助的案例。 - user3419168
我正在尝试一下,我找到了这个:https://dev59.com/YHE85IYBdhLWcg3wr1ux#2654860 所以我从那里开始。 - user3419168
这是用于编写位图的(更难,因为Windows支持较少)。加载一个位图非常容易:http://stackoverflow.com/a/15940441/179910 - Jerry Coffin
哦,我明白了。看起来很简单,但是我对“bmp”感到困惑。它不应该被创建为某种数据类型吗?只是将那一行代码放入我的代码中确实会出现“标识符未定义”的错误。非常感谢您的帮助,我相信我的新手表现已经显露无疑了。 - user3419168
我这样指定文件名可以吗?:(0,“print_file.bmp”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);无论我加引号还是不加引号,它似乎都不喜欢。 - user3419168
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接