在 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); //...