我用DrawText函数在屏幕上画实现预览功能
然后在纸上打印
但是同样的代码实际打印的右边距却不对那位高人可以给我个答案
然后在纸上打印
但是同样的代码实际打印的右边距却不对那位高人可以给我个答案
解决方案 »
- 一个关于CDC的问题
- 如何在框架类MainFrm中调用视图类CMyView中的函数?
- 菜鸟问题:VC的控件库编程
- 做过东软金保接口SiInterface的请进?
- 请教:如何在鼠标所在处显示一句话?
- 实现一个简单的功能:点击一个菜单后用鼠标在客户区画一个矩形框,鼠标在框内时可以移动这个矩形框,在边角上时可以改变框的大小,如何实
- 红遮脸问一下:怎样使单文档界面的边框大小不可改变,(去掉拉伸的双剑头)??
- 关于工具栏
- 一个socket端口扫描的例子,有BUG,不妨进来挑一挑
- 南充人一纸诉状要腾讯给说法
- 如何获得edit box 控件里面输入的值??(着急啊!!!!)
- 程序编译后没语法错误,但VC仍列出两个错误,这是为什么?
在真正的纸上打就会右边偏出12毫米
PDF虚拟打印机的物理偏移量为0,所以能正确打印。xOffset=GetDeviceCaps(hPrintDC, PHYSICALOFFSETX);
yOffset=GetDeviceCaps(hPrintDC, PHYSICALOFFSETY);SetViewportOrgEx(hPrintDC, xOffset, yOffset, NULL);
或
SetMapMode(hPrintDC, MM_HIMETRIC);
直接得x轴每英寸像素点数
GetDeviceCaps(memDC.m_hDC, LOGPIXELSX);和GetDeviceCaps(hPrintDC, LOGPIXELSX);的值是不一样的。
然后在int xP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSX);获得每英寸像素数
DOUBLE xPix = (DOUBLE)xP*10/254;
再获得每毫米像素数
然后再按照纸张的大小画在纸上的
SetMapMode(hPrintDC, MM_LOMETRIC);
然后用memDC.TextOut(1000, -200, (LPCTSTR)csTitle);画出来
应该是从左边1000毫米写东西
但还是差了1厘米多
不知为什么
2、memDC的映射模式是否也设为了MM_LOMETRIC?
MemDc.Attach(hdcPrint);
SetMapMode(MemDc.m_hDC, MM_LOMETRIC);都设了啊
MemDc.Attach(hdcPrint);
SetMapMode(MemDc.m_hDC, MM_LOMETRIC);
DOUBLE xOffset=GetDeviceCaps(memDC.m_hDC, PHYSICALOFFSETX);
DOUBLE yOffset=GetDeviceCaps(memDC.m_hDC, PHYSICALOFFSETY);
DOUBLE DD = SetViewportOrgEx(memDC.m_hDC, (int)xOffset, (int)yOffset, NULL);
memDC.StartPage();
CFont Title;
Title.CreateFont(-MulDiv(24,memDC.GetDeviceCaps(VERTSIZE),72),
0,0,0,FW_HEAVY,0,0,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T("黑体"));
memDC.TextOut(1000, -200, (LPCTSTR)csTitle);
memDC.EndDoc();
大致上是这样
int yOffset=::GetDeviceCaps(hdcPrint, PHYSICALOFFSETY);
DOCINFO docInfo={sizeof(DOCINFO)};
docInfo.lpszDocName="my print test";
docInfo.lpszOutput=NULL;
docInfo.lpszDataType=NULL;
docInfo.fwType=0;int nMapMode=SetMapMode(hdcPrint, MM_LOMETRIC);
POINT pt;
SetViewportOrgEx(hdcPrint, xOffset, yOffset, &pt);
HFONT hFont=CreateFont(-80, 0, //即然已映射模式已设为MM_LOMETRIC,直接指定字体高度为为所需的mm数
0,0,0,FW_HEAVY,0,0,0,GB2312_CHARSET,
OUT_STROKE_PRECIS,CLIP_DEFAULT_PRECIS,DRAFT_QUALITY,
VARIABLE_PITCH|FF_SWISS,_T("黑体"));
hFont=(HFONT)SelectObject(hdcPrint, hFont);::StartDoc(hdcPrint, &docInfo);
::StartPage(hdcPrint);
::TextOut(hdcPrint, 1000, -200, (LPCTSTR)csTitle);
::EndPage(hdcPrint);
::EndDoc(hdcPrint);
hFont=(HFONT)SelectObject(hdcPrint, hFont);
DeleteObject(hFont);SetMapMode(hdcPrint, nMapMode);
SetViewportOrgEx(hdcPrint, pt.x, pt.y, NULL);
SetViewportOrgEx(hdcPrint, -xOffset, -yOffset, &pt);
没法测试了为什么用xOffset的负值啊
SetWindowOrgEx是以逻辑单位表示的窗口的原点.TextOut(hdcPrint, xPos, yPos,...);是从原点开始 偏移xPos和yPos个单位。
打印机进纸时已偏移了xOffset个单位, 如果不修正这一偏移时,打印机会以当前位置为原点,根据你指定的位置输出内容。-xOffset是将原点移回至实际的页边上。