我在纸上打印非模式对话框上的内容
需要指定在向A4纸上某个固定的位置输出图像
下面是我的程序,我通过调节两个点的值来确定打印的位置和大小,这样做有没有问题?(位置和大小好像没法同时调好,SetViewportExt和SetViewportOrg会互相影响吗)
还有个问题很奇怪,屏幕分辨率72dpi/inch,打印机分辨率是600,打印的图片应该很小才对,事实上确定跟显示的差不多大,用的是lex普通的彩色打印机.
随便给点提示或建议什么的都十分感谢!
CPrintDialog dlg(FALSE,PD_NOPAGENUMS|PD_NOSELECTION|PD_DISABLEPRINTTOFILE, this);
if(dlg.DoModal() == IDOK)
{
CDC dc;
dc.Attach(dlg.GetPrinterDC());//把打印设备环境附加到DC对象
DOCINFO di; 
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "PrintImage";
di.lpszOutput = NULL;
di.lpszDatatype = NULL;
di.fwType = 0;
dc.StartDoc(&di); //通知打印机驱动程序执行一新的打印任务
dc.StartPage();//通知打印机驱动程序打印新页 /////////////////////////////////////////////////////////////////
dc.SetMapMode(MM_ISOTROPIC);  //设置坐标映射模式
CRect rcImageDlg;//需要打印的区域,是非模式对话框的客户区,有些小图片
GetClientRect(rcImageDlg);
CSize size(rcImageDlg.Width(),rcImageDlg.Height());
dc.SetWindowOrg(0,0);
dc.SetWindowExt(size);           //调节m_iRBPointX,m_iRBPointY的值确定打印的大小
float xExt = (float)size.cx*(size.cx/m_iRBPointX); 
float yExt = (float)size.cy*(size.cx/m_iRBPointY);  
dc.SetViewportExt((int)xExt, (int)yExt);
         //调节m_iLTPointX,m_iLTPointY设置rcImageDlg打印到纸上的位置
dc.SetViewportOrg(m_iLTPointX,m_iLTPointY);//设置视口原点(实际是设置窗口原点在视口中的位置?)
/////////////////////////////////////////////////////////////////

PrintOnDraw(&dc);//向打印机上绘图 dc.EndPage(); //通知打印机驱动程序页结束
dc.EndDoc();//通知打印机驱动程序打印完毕
DeleteDC(dc.Detach()); 
return TRUE;
}

解决方案 »

  1.   

    MM_ISOTROPIC要求window长宽比和viewport长宽比一样,即,保持几何形状不变形。否则,它会自动调整的!MM_ANISOTROPIC可以随便变形。
      

  2.   

    嗯,我把它改过来
    我发现一个问题,改变setviewportext()参数的值,实际上是改变了自定义的每逻辑单位代表的值的大小,因此也改变了setviewportorg中的参数代表的大小,造成了我想调节打印大小却同时改变了打印的位置
      

  3.   

    SetViewportOrg()//
    Parameters:Specifies the origin of the viewport. The values must be within the range of the device coordinate system.
    "must be within the range of the device coordinate "说明参数用的设备坐标,所以和setviewportext() 有关系,我个人认为~(待PP)