VC 中如何设置打印机的物理页边距?

eastsun 2004-04-21 04:15:56
VC 中如何设置打印机的物理页边距?

(不是指打印内容的页边距),而是指打印机的物理页边距。

百思不得其解,求教于诸位XDJM。

...全文
1169 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
FengYuanMSFT 2004-04-23
  • 打赏
  • 举报
回复
You can't. This is the result of mechanical limitation of printer design. Printer needs some space to hold paper during printing. So inkjet printer normally has a larger bottom margin.

New generation printers are trying to reduce those non-printable margins to as little as possible. Some printer supports paper with extra trims which are teared off after printing.

www.fengyuan.com
simouse 2004-04-23
  • 打赏
  • 举报
回复
关注ing...
swbreath 2004-04-23
  • 打赏
  • 举报
回复
每种打印机都有一个它自己的硬裁减区,在这之外的区域无法进行绘图工作,这是由打印机的属性,所使用的打印驱动程序、所选择的纸张大小共同决定的,而与你的打印程序无关,你所能做到的仅仅是改变纸张的选择,比如打印A4幅面的纸张,可以打印的区域肯定要比A4小,纸张大小297*210(没记错的话),一般可以打印的区域也就是289*19X左右
现在有一些打印机添加了过大尺寸类型纸张的选择,比如过大A4尺寸,选择这种大小的话就可以完全打印整个A4幅面的纸张了

记住,这是打印机的物理的属性,不能改变,只能选择
swbreath 2004-04-23
  • 打赏
  • 举报
回复
每种打印机都有一个它自己的硬裁减区,在这之外的区域无法进行绘图工作,这是由打印机的属性,所使用的打印驱动程序、所选择的纸张大小共同决定的,而与你的打印程序无关,你所能做到的仅仅是改变纸张的选择,比如打印A4幅面的纸张,可以打印的区域肯定要比A4小,纸张大小297*210(没记错的话),一般可以打印的区域也就是289*19X左右
现在有一些打印机添加了过大尺寸类型纸张的选择,比如过大A4尺寸,选择这种大小的话就可以完全打印整个A4幅面的纸张了

记住,这是打印机的物理的属性,不能改变,只能选择
swbreath 2004-04-23
  • 打赏
  • 举报
回复
没中打印机都有一个它自己的硬裁减区,在这之外的区域无法进行绘图工作,这是由打印机的属性,所使用的打印驱动程序、所选择的纸张大小共同决定的,而与你的打印程序无关
carbon107 2004-04-23
  • 打赏
  • 举报
回复
int GetDeviceCaps( HDC hdc, int nIndex);

  其中,hdc用来指定设备环境句柄,nIndex用来指定要获取的参量索引,对于打印机而言,它常常需要下列的预定义值:

   LOGPIXELSX   打印机水平分辨率

   LOGPIXELSY   打印机垂直分辨率

   PHYSICALWIDTH  打印纸的实际宽度

   PHYSICALHEIGHT 打印纸的实际高度

   PHYSICALOFFSETX 实际可打印区域的物理左边距

   PHYSICALOFFSETY 实际可打印区域的物理上边距


下面的函数代码就是用来设置页边距,并且还计算页面的物理边距:

void CEx_Prn1View::SetPageMargin(CDC *pDC, CPrintInfo *pInfo, int l, int t, int r, int b)
// l, t, r, b分别表示左上右下边距, 单位为0.1mm
{
int nOldMode = pDC->GetMapMode();
pDC->SetMapMode(MM_LOMETRIC);
// 计算一个设备单位等于多少0.1mm
double scaleX = 254.0 / (double)GetDeviceCaps(
pDC->m_hAttribDC, LOGPIXELSX);
double scaleY = 254.0 / (double)GetDeviceCaps(
pDC->m_hAttribDC, LOGPIXELSY);
int x = GetDeviceCaps(pDC->m_hAttribDC,
PHYSICALOFFSETX);
int y = GetDeviceCaps(pDC->m_hAttribDC,
PHYSICALOFFSETY);
int w = GetDeviceCaps(pDC->m_hAttribDC,
PHYSICALWIDTH);
int h = GetDeviceCaps(pDC->m_hAttribDC,
PHYSICALHEIGHT);
int nPageWidth = (int)((double)w*scaleX + 0.5);
// 纸宽,单位0.1mm
int nPageHeight = (int)((double)h*scaleY + 0.5);
// 纸高,单位0.1mm
m_nPhyLeft = (int)((double)x*scaleX + 0.5);
// 物理左边距,单位0.1mm
m_nPhyTop = (int)((double)y*scaleY + 0.5);
// 物理上边距,单位0.1mm
pDC->DPtoLP(&pInfo->m_rectDraw);
CRect rcTemp = pInfo->m_rectDraw;
rcTemp.NormalizeRect();
m_nPhyRight = nPageWidth - rcTemp.Width() -
m_nPhyLeft; // 物理右边距,单位0.1mm
m_nPhyBottom = nPageHeight - rcTemp.Height() -
m_nPhyTop; // 物理下边距,单位0.1mm
// 若边距小于物理边距,则调整它们
if (l < m_nPhyLeft) l = m_nPhyLeft;
if (t < m_nPhyTop) t = m_nPhyTop;
if (r < m_nPhyRight) r = m_nPhyRight;
if (b < m_nPhyBottom) b = m_nPhyBottom;
// 计算并调整pInfo->m_rectDraw的大小
pInfo->m_rectDraw.left = l - m_nPhyLeft;
pInfo->m_rectDraw.top = - t + m_nPhyTop;
pInfo->m_rectDraw.right -= r - m_nPhyRight;
pInfo->m_rectDraw.bottom += b - m_nPhyBottom;
pDC->LPtoDP(&pInfo->m_rectDraw);
pDC->SetMapMode(nOldMode);
// 恢复原来的映射模式
}
eastsun 2004-04-23
  • 打赏
  • 举报
回复

多谢楼上。这与我从HP的支持工程师得到的答复完全一样。不过也有物理页边距为0的照片打印机,不过没有用程序控制过。多谢大家的热情参与讨论。
ahao 2004-04-21
  • 打赏
  • 举报
回复
gz
eastsun 2004-04-21
  • 打赏
  • 举报
回复


up.
VC 获得打印面信息,主要是获得打印面宽度、高度、物理面宽度、高度、上、下、左、右边距等信息。不想下载完整源码包的,可先看下面的核心代码段:   //打印对话框   DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS    | PD_NOSELECTION | PD_HIDEPRINTTOFILE;   CPrintDialog dlg(FALSE);   if (dlg.DoModal() == IDOK)   {    //获得打印机DC    HDC hDC = dlg.GetPrinterDC();    if (hDC == NULL)    {    return;    }    //通过HDC获得CDC指针    CDC* pDC = CDC::FromHandle(hDC);    //获得打印面宽度    int nHorzSize = pDC->GetDeviceCaps(HORZRES);    //获得打印面高度    int nVertSize = pDC->GetDeviceCaps(VERTRES);    //获得物理面宽度    int nWidth = pDC->GetDeviceCaps(PHYSICALWIDTH);    //获得物理面高度    int nHeight = pDC->GetDeviceCaps(PHYSICALHEIGHT);    //获得左、右边距    int nOffsetX = pDC->GetDeviceCaps(PHYSICALOFFSETX);    //获得上、下边距    int nOffsetY= pDC->GetDeviceCaps(PHYSICALOFFSETY);    CString strText = _T("");    strText.Format(_T("%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d"),    _T("打印面宽度:"), nHorzSize,    _T("打印面高度:"), nVertSize,    _T("物理面宽度:"), nWidth,    _T("物理面高度:"), nHeight,    _T("左右边距:"), nOffsetX,    _T("上下边距:"), nOffsetY);    AfxMessageBox(strText);   }

16,472

社区成员

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

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

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