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

Printing a specified BMP file to printer

本文关键字:文件 打印机 BMP 打印      更新时间:2023-10-16

我遇到了一个对我来说非常陌生的问题:打印到打印机上。

通过上网搜索,我找到了一种打印到我的打印机上的方法,但只是简单的文本。

看到:

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

}

打印到打印机上与打印到屏幕上没有太大的区别。你已经处理了所有与打印机不同的"东西"。

你的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)。有一次,你会经常遇到这种情况,但我已经有一段时间没有看到了。