高分100分求教,关于打印方面的问题.

dnyz520 2009-11-24 12:40:36
因公司需要做了一个快递单打印软件,在家测试的时候使用虚拟打印机"Microsoft XPS Document Writer"一切都正常,回公司使用"EPSON LQ-1600KIII"和"Epson LQ-680Pro ESC/P 2"还有"Epson Me360"做测试的时候发现内容有些偏移.

另外为了使用方便就直接在打印前就设置了纸张的大小.翻了一下论坛上的帖子后也找不到问题到底出在哪.
图片一是使用"Microsoft XPS Document Writer"一切都是正常的.后2张分别是"EPSON LQ-1600KIII"和"Epson LQ-680Pro ESC/P 2"红色区域就是偏移的地方.





附上视类相关代码.


void CExpressPrintView::OnDraw(CDC* pDC)
{
CExpressPrintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码
if (!pDoc->m_Image.IsNull())
{
int nIndex1 = pDoc->m_nMoveXy.GetSize();
CFont font;
font.CreatePointFont(110, _T("宋体"), NULL);
CFont* pOldFont = pDC->SelectObject(&font);
pDoc->m_Image.Draw(pDC->m_hDC,0,0);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0, 102, 255));
for (int nIndex2=0; 0<nIndex1; nIndex2++)
{
int nCoordinate1 = pDoc->m_nMoveXy.GetAt(--nIndex1);
int nCoordinate2 = pDoc->m_nMoveXy.GetAt(--nIndex1);
CString strData = pDoc->m_strData.GetAt(nIndex2);
if (nCoordinate1 || nCoordinate2)
{
if (_T("-1") == strData)
{
pDC->TextOut(nCoordinate1, nCoordinate2, _T("√"));
}else if (_T("0") == strData){}
else pDC->TextOut(nCoordinate1, nCoordinate2, strData);
}
}
pDC->SelectObject(pOldFont);
}
}



void CExpressPrintView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

CExpressPrintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

CSize sizeTotal;
// TODO: 计算此视图的合计大小
if (!pDoc->m_Image.IsNull())
{
sizeTotal.cx = pDoc->m_Image.GetWidth();
sizeTotal.cy = pDoc->m_Image.GetHeight();
}
else
{
sizeTotal.cx = sizeTotal.cy = 100;
}
SetScrollSizes(MM_TEXT, sizeTotal);
}



// 设置纸张的大小
BOOL CExpressPrintView::OnPreparePrinting(CPrintInfo* pInfo)
{
CPrintDialog dlgPrint(FALSE);
LPDEVMODE pDM;
PRINTDLG pdlg;
if (!AfxGetApp()->GetPrinterDeviceDefaults(&pdlg))
return FALSE;

CExpressPrintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return FALSE;

pDM = (LPDEVMODE)GlobalLock(pdlg.hDevMode);
pDM->dmPaperSize = DMPAPER_USER;
pDM->dmPaperLength = pDoc->m_nIndentLeft;
pDM->dmPaperWidth = pDoc->m_nIndentRight;
pDM->dmFields = DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH | pDM->dmFields;
pDM->dmFields = pDM->dmFields | DMBIN_MANUAL;
pDM->dmDefaultSource = DMBIN_MANUAL;
GlobalUnlock(pdlg.hDevMode);

// 默认准备
return DoPreparePrinting(pInfo);
}



void CExpressPrintView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: 在此添加专用代码和/或调用基类
CScrollView::OnPrepareDC(pDC, pInfo);

//转换坐标映射方式
pDC->SetMapMode(MM_ANISOTROPIC);
//确定窗口大小
CSize size = CSize(800, 560);
// 设定窗口尺寸
pDC->SetWindowExt(size);
//得到实际设备每逻辑英寸的象素数量
int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
//得到设备坐标和逻辑坐标的比例
long xExt = (long)size.cx * xLogPixPerInch / 96;
long yExt = (long)size.cy * yLogPixPerInch / 96;
// 设定视口尺寸
pDC->SetViewportExt((int)xExt, (int)yExt);
}
...全文
83 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowaxberry 2010-12-17
  • 打赏
  • 举报
回复
asp.net版本的
WecanHuang 2009-11-27
  • 打赏
  • 举报
回复
楼主你让我很感动
不过你给我这么多分
我怕版主说你给我倒分
那我跳到墨水瓶都洗不白了
WecanHuang 2009-11-24
  • 打赏
  • 举报
回复
听说回帖有可用分
dirdirdir3 2009-11-24
  • 打赏
  • 举报
回复
打印页面设置的时候把margin去掉
江川 2009-11-24
  • 打赏
  • 举报
回复
void CExpressPrintView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
中间设置你的分辨率和打印机一致,这类问题最好联系打印厂家。
票据打印他们应该提供COM通讯包的。
dnyz520 2009-11-24
  • 打赏
  • 举报
回复
自己顶下
dnyz520 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dirdirdir3 的回复:]
打印页面设置的时候把margin去掉
[/Quote]

朋友,有没有详细点的?

16,551

社区成员

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

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

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