自定义纸张打印失败,求高手过来看下

zemelaoshi 2014-09-24 11:01:05
我在"Kyocera TASKalfa 400ci KX"打印机上打印一个自定义大小(200*400)的纸张,但是打印总是以默认纸张大小出纸。网上我也找了很多代码,他们的写法都跟我类似,但还是设定不上。下面是我的源码,求高手帮忙看下:

#include "stdafx.h"
#include <windows.h>
#include <winspool.h>

class ScopeHDC {
HDC hdc;
public:
explicit ScopeHDC(HDC hdc) : hdc(hdc) { }
~ScopeHDC() { DeleteDC(hdc); }
operator HDC() const { return hdc; }
};

int _tmain(int argc, _TCHAR* argv[])
{
LPTSTR pPrinterName = _T("Kyocera TASKalfa 400ci KX");
LPTSTR pDriverName = _T("Kyocera TASKalfa 400ci KX");
LPTSTR pPortName = _T("192.168.100.100");
HANDLE hPrinter;
PRINTER_INFO_2 *pi2 = NULL;
BOOL bFlag;
DWORD dwNeeded = 0;
PRINTER_DEFAULTS pd;
ZeroMemory(&pd, sizeof(pd));
pd.DesiredAccess = PRINTER_ALL_ACCESS;
BOOL res = OpenPrinter(pPrinterName, &hPrinter, &pd);
if (!res) {
return false;
}

LPDEVMODE devMode = NULL;
GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded);
pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
if (pi2 == NULL)
{
ClosePrinter(hPrinter);
return FALSE;
}

bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);
if (!bFlag)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
return FALSE;
}

LONG structSize = DocumentProperties(NULL,
hPrinter,
pPrinterName,
NULL, /* Asking for size, so */
NULL, /* not used. */
0); /* Zero returns buffer size. */
if (structSize < sizeof(DEVMODE)) {
}
devMode = (LPDEVMODE)malloc(structSize);
if (!devMode)
return 0;

DocumentProperties(NULL,
hPrinter,
pPrinterName,
devMode,
NULL,
DM_OUT_BUFFER);
pi2->pDevMode = devMode;

DeleteForm(hPrinter, _T("Test Form"));
FORM_INFO_1 * pF1;
pF1=new(FORM_INFO_1);
pF1->Flags=FORM_USER;
pF1->pName=_T("Test Form");
pF1->Size.cx=2000*1000;
pF1->Size.cy=4000*1000;
pF1->ImageableArea.left=0;
pF1->ImageableArea.top=0;
pF1->ImageableArea.right=pF1->Size.cx;
pF1->ImageableArea.bottom=pF1->Size.cy;

devMode->dmFields = DM_FORMNAME;
wcscpy(devMode->dmFormName,pF1->pName);

LONG returnCode = DocumentProperties(NULL,
hPrinter,
pPrinterName,
devMode, /* The address of the buffer to fill. */
devMode, /* Not using the input buffer. */
DM_IN_BUFFER|DM_OUT_BUFFER); /* Have the output buffer filled. */
if (IDOK != returnCode) {
return 0;
}
if (!AddForm(hPrinter,1,(LPBYTE)pF1))
{
DWORD dwError = GetLastError();
delete pF1;
ClosePrinter(hPrinter);
return 0;
}

ScopeHDC hdc(CreateDC(pDriverName, pPrinterName, pPortName, devMode));
if (!hdc)
return false;

DOCINFO di = { 0 };
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = (LPCTSTR)TEXT("Test Print");
di.lpszOutput = (LPTSTR) NULL;
di.lpszDatatype = (LPTSTR) NULL;
di.fwType = 0;

int nJobId = StartDoc(hdc, &di);
if (nJobId <= 0)
{
DWORD dwError = GetLastError();
return false;
}
StartPage(hdc);
SaveDC(hdc);
TextOut(
hdc,
100,
100,
_T("Test Test"),
wcslen(_T("Test Test")));
RestoreDC(hdc,-1);
EndPage(hdc);
EndDoc(hdc);
delete pF1;
ClosePrinter(hPrinter);
return 0;
}
...全文
559 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
一条晚起的虫 2014-11-12
  • 打赏
  • 举报
回复
// DEVMODE中的dmPaperSize,设为DMPAPER_USER,并设置dmPaperWidth, dmPaperHeight // dmFields中,置位DM_PAPERSIZE,DM_PAPERLENGTH,DM_PAPERWIDTH
赵4老师 2014-09-24
  • 打赏
  • 举报
回复
试试使用API Monitor软件监视别人的程序都调用了哪些API以及如何调用。
zemelaoshi 2014-09-24
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
没准打印机不支持或打印机驱动不支持。
这台打印机可以设定上的,就是不知道别人是如何实现的。
赵4老师 2014-09-24
  • 打赏
  • 举报
回复
没准打印机不支持或打印机驱动不支持。
zemelaoshi 2014-09-24
  • 打赏
  • 举报
回复
还有一点我没有弄懂,就是如果dmPaperSize我写入9("A4"),dmFormName我写入上面自定义纸张类型。打印机驱动怎么知道采用的纸张类型是dmPaperSize的值,还是dmFormName的值。
赵4老师 2014-09-24
  • 打赏
  • 举报
回复
引用 5 楼 zemelaoshi 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] 试试使用API Monitor软件监视别人的程序都调用了哪些API以及如何调用。
我用的Process Monitor和dumpbin工具查看的,你用的工具是什么,还能看到如何调用吗?[/quote] http://www.baidu.com/s?wd=API+Monitor&rsv_spt=1&issp=1&f=8&rsv_bp=0&ie=utf-8&tn=baiduhome_pg&rsv_sug3=10&rsv_sug=0&rsv_sug1=10&rsv_sug4=185&inputT=5750
笨笨仔 2014-09-24
  • 打赏
  • 举报
回复
设置后调用GetDevMode(),查看DEVMODE结构中的数据是否发生改变。
zemelaoshi 2014-09-24
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
试试使用API Monitor软件监视别人的程序都调用了哪些API以及如何调用。
我用的Process Monitor和dumpbin工具查看的,你用的工具是什么,还能看到如何调用吗?

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧