gpt4 book ai didi

c++ - 将指定的 BMP 文件打印到打印机

转载 作者:太空狗 更新时间:2023-10-29 21:42:59 25 4
gpt4 key购买 nike

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

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

看这里:

#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。因此,一张在屏幕上看起来合理的图片在打印机上通常看起来很小。根据其尺寸,您可能希望在打印到打印机时放大图片。

顺便说一句:还有一些少数打印机与 Bit Blitting 不兼容。在写入数据之前,您可能需要使用 GetDeviceCaps(RC_BITBLT)GetDeviceCaps(RC_STRETCHBLT)。曾经,您经常遇到这种情况,但我已经有一段时间没有看到了。

关于c++ - 将指定的 BMP 文件打印到打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24001675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com