打印指定的BMP文件到打印机
Printing a specified BMP file to printer
我遇到了一个对我来说非常陌生的问题:打印到打印机上。
通过上网搜索,我找到了一种打印到我的打印机上的方法,但只是简单的文本。
看到:
#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:
- 加载BMP
- 创建与目标DC兼容的DC
- 选择BMP为兼容的DC
- 从兼容的DC到打印机的DC。
最大的区别在于屏幕通常有大约100 DPI,而打印机通常至少有300 DPI。因此,在屏幕上看起来合理的图片在打印机上通常看起来很小。根据尺寸的不同,在打印到打印机上时,您可能希望将图片按比例放大。
作为题外话:也有少数打印机不兼容位比特化。您可能希望在写入数据之前使用GetDeviceCaps(RC_BITBLT)
或GetDeviceCaps(RC_STRETCHBLT)
。有一次,你会经常遇到这种情况,但我已经有一段时间没有看到了。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 打印指定的BMP文件到打印机
- 从打印机访问文件