原文http://www.souzz.net/html/edu/asp/asp9/5051.html
LPDEVMODE lpDevMode;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd)) //获得默认的打印机的信息
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
if(lpDevMode)
{
lpDevMode->dmPaperSize=DMPAPER_A4; //将打印纸设置为A4
lpDevMode->dmOrientation=DMORIENT_LANDSCAPE; //将打印机设置为横向打印。
lpDevMode->dmPrintQuality=600 //打印分辨率为600dpi
}
GlobalUnlock(pd.hDevMode);
}
结合自己的实际情况,在重载的函数CView::DoPreparePrinting中添加如下加粗代码即可完成:
BOOL CView::DoPreparePrinting(CPrintInfo* pInfo)
{
.......
// otherwise, bring up the print dialog and allow user to change things
// preset From-To range same as Min-Max range
pInfo->m_pPD->m_pd.nFromPage = (WORD)pInfo->GetMinPage();
pInfo->m_pPD->m_pd.nToPage = (WORD)pInfo->GetMaxPage();
//以下部分为额外添加的,目的是在弹出打印对话框前,设定打印机的默认分辨率为600
LPDEVMODE lpDevMode;
if(AfxGetApp()->GetPrinterDeviceDefaults(&(pInfo->m_pPD->m_pd))) //获得默认的打印机的信息
{
lpDevMode=(LPDEVMODE)GlobalLock(pInfo->m_pPD->m_pd.hDevMode);
if(lpDevMode)
{
CString prtName;
prtName=lpDevMode->dmDeviceName;
lpDevMode->dmPrintQuality=300; //打印分辨率初始化为300dpi
lpDevMode->dmFields=DM_PRINTQUALITY;
}
GlobalUnlock(pInfo->m_pPD->m_pd.hDevMode);
}
if (pApp->DoPrintDialog(pInfo->m_pPD) != IDOK)
return FALSE; // do not print
}
.......
}
但是这又出现了另一个问题,就是在实际打印时,打印机不一定支持300dpi的分辨率,所以转换思路,根据用户实际打印设备的分辨率,调整CDC类对象的映射模式,其中pInfo为CPrintInfo类的指针,hDC为HDC类对象:
pInfo->m_pPD->m_pd.Flags=PD_RETURNDC;
hDC=pInfo->m_pPD->m_pd.hDC;
int dpi=GetDeviceCaps(hDC,LOGPIXELSX);
pDC->SetMapMode(MM_ISOTROPIC);
//根据打印机的分辨率调整逻辑窗口的大小
pDC->SetWindowExt(300*600/dpi,300*600/dpi);
CRect rectClient;
GetClientRect(rectClient);//取窗口物理尺寸(单位:像素)
pDC->SetViewportExt(rectClient.right, rectClient.bottom);//改变Y坐标方向--viewport使用物理大小
pDC->SetViewportOrg(rectClient.left, rectClient.top);//设置窗口左上角为坐标系原点--Viewport使用物理大小
参考http://embeded-life.blog.163.com/blog/static/105932519200942511462758/
这样在测试时,便显示正确了,与打印设备的分辨率无关,所以上面的一部分代码完全可以不要。