在VC对话框中实现打印和打印预览

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在VC对话框中实现打印和打印预览(附实现步骤)

时间:2008-01-27作者:佚名

在一般的软件开发中打印和打印预览是经常要用到的功能,对于VC6.0中的文档/视图(Doc/View)框架,可以很方便的使用缺省的打印和打印预览。但是,如果应用程序是基于对话框的就没有办法利用这种便利。而很多情况下,基于对话框的程序也需要打印和打印预览功能。那该怎么办呢?这正是本文将要解决的问题。

1实现打印

在对话框应用程序中不具备MFC的视和框架交互,要想实现打印和打印预览必须直接获取打印机的设备环境句柄,这时可以设置CPringDialog类中的构造函数的参数,获取打印机的设备环境句柄。利用这个句柄,转换为指针,则按打印流程实现打印任务。

(1)从CFrameWnd类派生出主窗口类CMyFrameWnd加入项目,这个类将作为控制类来实现程序的打印和打印预。

(2)在CMyFrameWnd中加入打印和打印预览相关的函数,为了方便起见,名字和CView视图类中缺省的打印和打印预览虚函数名相同。但这些函数是以成员函数的形式加入的,而不是重载。这里主要介绍Print和OnPrint函数。

Print函数是打印控制函数,由它来弹出打印对话框,取得用户设置信息,如打印机、纸张大小等。还有建立一个打印机DC和设置DOCINFO 结构,该结构包含输入输出文件名及其它一些信息,StartDoc函数要该结构作参数。还要设置打印区域,调用打印函数等

void CMyFrameWnd::Print()

{

CDC dc;

CPrintDialog printDlg(FALSE);

if (printDlg.DoModal() != IDOK)

//弹出打印对话框,取得用户设置参数

return;

dc.Attach(printDlg.GetPrinterDC());

//绑定一个打印机DC到CDC

dc.m_bPrinting=TRUE;

DOCINFO di; //初始化打印机的DOCINFO

memset(&di,0,sizeof (DOCINFO));

di.cbSize=sizeof (DOCINFO);

BOOL bPrintingOK=dc.StartDoc(&di); //开始一个打印任务CPrintInfo Info;

Info.m_rectDraw.SetRect(0,0,dc.GetDeviceCaps(HORZRES), c.GetDeviceCaps(VERTRES));

//设置打印区域大小

OnBeginPrinting(&dc,&Info); //打印初始化

for (UINT page = Info. GetMinPage ( ); page < = Info. GetMaxPage() && bPrintingOK; page++)

{

dc.StartPage(); //开始一个新的打印页

Info.m_nCurPage=page;

OnPrint(&dc,&Info); //打印

bPrintingOK=(dc.EndPage() > 0); //打印页结束

}

OnEndPrinting(&dc,&Info); //打印完成后释放资源

if (bPrintingOK)

dc.EndDoc(); //一个打印任务结束

else

dc.AbortDoc(); //终止打印任务

dc.Detach(); //释放打印机DC

}

OnPrint函数主要设置映射参数,调用对话框的绘图函数等功能,具体如下: void CMyFrameWnd::OnPrint(CDC *pDC,CPrintInfo *pInfo)//

{

if (!pDC || !pInfo) return;

CFont *pOldFont=pDC->SelectObject(&m_PrinterFont);

//设置映射参数及边界

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetWindowExt(m_LogicalPageSize);

pDC->SetViewportExt(m_PaperSize);

pDC->SetWindowOrg(-LEFT_MARGIN*m_CharSize.cx,0);

pDC->SetWindowOrg(0,0);

pDC->SelectObject(pOldFont);

}

2实现打印预览

通过以上几个函数就已经可以打印了,要实现打印预览,还要作一些工作。因为打印预览函数的执行都依赖于CView和CFrameWnd框架,所以,我们建立临时的框架类和视图类,然后调用这个临时视图类的缺省函数OnFilePrint和OnFilePrintPreview。

(1)从CView类派生出CMyView类加入项目。并在CMyView类中重载相关的打印和打印预览函数。这个类主要用来传递OnBeginPrinting,OnPrint,OnEndPrinting等相关函数。

(2 )在控制类的PrintPreview函数中用一个CsingleDocTemplate对象创建框架和视图窗口,其中视图类CMyView并不显示,因为它马上就被预览视图(preview view)所掩盖。m_pMainWnd改为指向新的CFrameWnd,这样预览类就可以用它作为主框架。m_pMainWnd的初始值被保存下来,当预览结束时,要将m_pMainWnd恢复到其初始值。当然,要在控制类包含头文件MyView.h。具体程序如下:

void CMyFrameWnd::PrintPreview()

{

if (m_bPrintPreview) //预览标志符

{

AfxGetApp()->m_pMainWnd->SetFocus();

return;

}

CFrameWnd* pOldFrame=(CFrameWnd*)AfxGetThread()->m_pMainWnd;

pOldFrame->ShowWindow(SW_HIDE);

// m_pMainWnd初始值被保存,原来框架被隐藏

相关文档
最新文档