• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

如何在打印过程中(StartPage()之后)设置纸张大小?(有完整源代码)

lily311 2002-05-08 05:33:09
目的: 在打印过程中设置纸张大小为要打印的文本大小, 避免打印完后大量的走纸.
方法: 第一次DrawText()得到要打印文本的长,宽, 设置打印机纸张大小为同等大小, 第二次DrawText()开始打印.
问题: 通过
// Set actual paper size, convert unit from pixel to mm
dev->dmPaperSize = 0;
dev->dmPaperWidth = ((rect.Width())*(dev->dmPaperWidth))/w;
dev->dmPaperLength = ((rect.Height())*(dev->dmPaperLength))/h;
BOOL Result = dc.ResetDC(dev);
设置打印设备纸张大小时, ResetDC()返回值为0, 设置无效.

Any help be appreciated!

void PrintText(CString text)
{
int lengthToGo = text.GetLength();
if (lengthToGo <= 0)
return;

CString strTitle;
strTitle.LoadString(AFX_IDS_APP_TITLE);

// Attach a printer DC
CDC dc;
CPrintDialog printDlg(false);
printDlg.GetDefaults();
DEVMODE* dev = printDlg.GetDevMode();
dc.Attach(printDlg.GetPrinterDC());
dc.m_bPrinting = TRUE;

// Initialise print document details
DOCINFO di;
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
// application title appears in the spooler view
di.lpszDocName = strTitle;

CRect rect;
int w = dc.GetDeviceCaps(HORZRES); // Pixel
int h = dc.GetDeviceCaps(VERTRES); // Pixel
rect.SetRect(0,0, w, h);

// Begin a new print job
BOOL bPrintingOK = dc.StartDoc( &di );

// begin new page
dc.StartPage();

// Get rect, which determines the width and height of the print area
dc.DrawText(text, lengthToGo, rect, DT_CALCRECT|DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);

// Set actual paper size, convert unit from pixel to mm
dev->dmPaperSize = 0;
dev->dmPaperWidth = ((rect.Width())*(dev->dmPaperWidth))/w;
dev->dmPaperLength = ((rect.Height())*(dev->dmPaperLength))/h;
BOOL Result = dc.ResetDC(dev);

// print that text
dc.DrawText(text, lengthToGo, rect, DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);

// end page
bPrintingOK = (dc.EndPage() > 0);

// end a print job
if (bPrintingOK)
dc.EndDoc();
else
// abort job.
dc.AbortDoc();

// detach the printer DC
dc.Detach();
}
...全文
118 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
purfan 2002-06-20
关注...
回复
lily311 2002-06-17
hzhr(??????) :如你所说做了相应更改,还是没有用.
ResetDC()返回值仍然为0.

我注意到MSDN中对ResetDC()函数的用法有以下两段,不知有没有影响.


"You cannot use this member function to change the driver name, device name, or output port. When the user changes the port connection or device name, you must delete the original device context and create a new device context with the new information.
Before you call this member function, you must ensure that all objects (other than stock objects) that had been selected into the device context have been selected out."

可是我对打印机的编程不太熟悉,不太清楚该如何用程序来实现.

回复
hzhr 2002-06-05
自定义纸张大小有最小的限制,跟你的打印机型号有关,看
dev->dmPaperWidth = ((rect.Width())*(dev->dmPaperWidth))/w;
dev->dmPaperLength = ((rect.Height())*(dev->dmPaperLength))/h;
可能计算出来的值太小了
建议改为
dev->dmPaperSize = DMPAPER_USER;
另外设置
dev->dmFields |= DM_PAPERSIZE;
dev->dmFields |= DM_PAPERWIDTH;
dev->dmFields |= DM_PAPERLENGTH;
回复
lily311 2002-05-13
Help!
如何在打印过程中设置纸张大小?(
回复
lily311 2002-05-09
dev->dmPaperSize = 0 没错呀!我是要自定义纸张大小.
dmPaperSize :This member can be set to zero if the length and width of the paper are both set by the dmPaperLength and dmPaperWidth members.
回复
lily311 2002-05-09
dmPaperSize设置为256也没有用!
ResetDC()返回值仍然为0, 设置无效.
回复
huqiming 2002-05-09
告诉你个不好的消息,这个地方是msdn中的bug
实际上如果用自定义大小的纸张,必须设置为256

不信你可以用cprintdialog定义一个自定义的纸张,再调试看
dmPaperSize一定是256
回复
huqiming 2002-05-08
dev->dmPaperSize = 0;错了
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-08 05:33
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……