关于用代码输出内容到条码打印机,打1张,走6张纸的问题

wmajia 2016-05-20 05:07:12
因近期要在产品贴一个二维码以及流水号,每个产品码值不一样,因此公司 写了个简单的打印程序。

打印的内容和显示,没有问题,但条码打印机走纸大大的浪费,每打1张,都会先走5张空的出来!!第6张上面才是真正的打印内容。 浪费条码纸和色带!

为了简单代码,我把打印二维码的代码去掉,跟打印机相关的代码如下,请帮忙看看问题出在哪,多谢!是不是要通过代码设置打印纸张的大小?



void Print()
{
//获取打印的X Y
this->UpdateData();
dwStartX = atoi(m_strPointX);
dwStartY = atoi(m_strPointY);

//获取打印机
CString strPrintDevice = "";
this->GetDlgItem(IDC_COMBO1)->GetWindowText(strPrintDevice);
if (strPrintDevice.IsEmpty()){
AfxMessageBox(_T("打印失败"));
return;
}

DWORD dwFlag = PD_ALLPAGES | PD_NOPAGENUMS | PD_USEDEVMODECOPIES | PD_HIDEPRINTTOFILE;
CPrintDialog pPrintdlg(FALSE, dwFlag, this);

HGLOBAL hDevMode = NULL;
HGLOBAL hDevNames = NULL;
if (GetPrinterDevice(strPrintDevice.GetBuffer(0), &hDevNames, &hDevMode)) {
AfxGetApp()->SelectPrinter(hDevNames, hDevMode);
}
else {
AfxMessageBox(_T("Failed to select custom printer"));
}

strPrintDevice.ReleaseBuffer();
pPrintdlg.m_pd.hDevMode = hDevMode;
pPrintdlg.m_pd.hDevNames = hDevNames;

CDC dc;
BOOL InvalidatePrint = dc.Attach(pPrintdlg.CreatePrinterDC());
DOCINFO di;
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = _T("TAPCQRCODE");
di.lpszDatatype = NULL;
di.lpszOutput = NULL;
di.fwType = 0;

if (dc.StartDoc(&di)==-1) {
dc.EndDoc();
AfxMessageBox(_T("打印错误"));
return;
}

dc.StartPage();
dc.SetMapMode(MM_TEXT);
CRect recPrint(0, 0, dc.GetDeviceCaps(LOGPIXELSX), dc.GetDeviceCaps(LOGPIXELSY));
dc.DPtoLP(&recPrint);
dc.SetWindowOrg(0, 0);

//打印字体
CFont newFont;
VERIFY(newFont.CreatePointFont(dwFontSize, _T("黑体"), &dc));
CFont* oldFont = dc.SelectObject(&newFont);
dc.SetTextAlign(TA_TOP|TA_LEFT);

SetTextColor(dc,RGB(0,0,0));
CString strIMEI;
strIMEI.Format("IMEI:%s", m_strIMEI.Mid(0, IMEI_LENTH));

CRect rc;
rc.left = dwStartX+ dwQrCodeWidth + dwGapQRCodeString;
rc.top = dwStartY;
rc.right = rc.left+dwTextWidth;
rc.bottom= rc.top+ dwQrCodeWidth;

//打印流水号1
CString strPrint;
strPrint.Format("%s\n%s",m_strType, m_strName);
dc.DrawText(strPrint,rc,DT_VCENTER|DT_LEFT);

CFont newFontIMEI;
VERIFY(newFontIMEI.CreatePointFont(58, _T("黑体"), &dc));
dc.SelectObject(&newFontIMEI);

rc.left = dwStartX+ dwQrCodeWidth + dwGapQRCodeString;
rc.top = dwStartY+dwIMEIOffset;
rc.right = rc.left+dwTextWidth;
rc.bottom= rc.top+ dwQrCodeWidth+dwIMEIOffset;

//打印流水号 2
strPrint.Format("%s\n%s",strIMEI,m_strSN);
dc.DrawText(strPrint,rc,DT_VCENTER|DT_LEFT);

dc.SelectObject(oldFont);
newFont.DeleteObject();
newFontIMEI.DeleteObject();

dc.EndPage();
dc.EndDoc();
DeleteDC(dc.Detach());
}

...全文
442 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmajia 2016-05-20
  • 打赏
  • 举报
回复
已解决,其中 dev->dmOrientation 是设置纸张水平还是垂直的。

DWORD dwFlag=PD_ALLPAGES | PD_NOPAGENUMS | PD_USEDEVMODECOPIES | PD_SELECTION | PD_HIDEPRINTTOFILE | PD_RETURNDEFAULT;	
	CPrintDialog dlg(FALSE,dwFlag,NULL);
	if (dlg.DoModal() == IDOK)
	{
		//定义打印纸的大小
		LPDEVMODE dev      = dlg.GetDevMode();
		dev->dmPaperSize   = DMPAPER_USER;
		dev->dmPaperLength = 200 * 10;				//打印纸长度
		dev->dmPaperWidth  = 100 * 10;				//打印纸宽度
		dev->dmOrientation = DMORIENT_LANDSCAPE;
		dev->dmFields = DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH | dev->dmFields;

		CDC dc;
		dc.Attach(dlg.GetPrinterDC());						//获得打印机设备上下文
		dc.ResetDC(dev);		
		CFont TextFont;
		TextFont.CreatePointFont(150,"宋体",&dc);			//设置字体
		dc.StartDoc("print");								//开始打印
		dc.SelectObject(&TextFont);						//选入字体
		dc.TextOut(200,200,"山无棱,江水为竭,冬雷震震,夏雨雪,天地合,乃敢与君绝!");
		dc.EndDoc();									//结束打印
		TextFont.DeleteObject();
		dc.DeleteDC();
	}
wmajia 2016-05-20
  • 打赏
  • 举报
回复
顶一下!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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