下载本文示例代码
通过MFC来完成打印作业有很多的方法,应用场合也有所不同。我们通常是利用视图框架在MFC基础之上按照OnPreparePrinting() à OnBeginPrinting() ? à OnPreprareDC() à OnPrinting () à OnEndPrinting()的顺序来编程的。对于我们使用单文档或者多文档的视图框架时这无疑是一种很好的方式。但是,在基于对话框的应用程序中,或者在很多打印要求不高的情况下(如只是简单的打印中间计算结果、报告程序异常等),我们就没有必要再绕上面的那么一个大弯子,可以直接利用MFC封装的打印对话框CPrintDialog来执行简单的打印任务。当然,如果你不怕烦,这种方式也可以执行很复杂的打印作业。 下面做一个简单的例子程序。利用Visual C 6.0 的AppWizard生成一个对话框应用程序框架。然后,利用资源编辑器添加一个Edit控件,属性设置为:选择Multiline、Want Return ,根据你的兴趣选择滚动条有关的项,绑定成员变量m_strPrintString。使“确定(OK)”按钮不接受程序的“Enter”键消息,Caption改为“打印(Print)”。此键按下的处理函数如下:if (!UpdateData(TRUE)){AfxMessageBox("数据交换有误!");}if (m_strPrintString==_T("")){AfxMessageBox("请输入需要打印的文字?quot;);return;}CPrintDialog dlg(FALSE,PD_NOPAGENUMS|PD_NOSELECTION,this);if(dlg.DoModal() == IDOK){CDC dc;dc.Attach(dlg.GetPrinterDC());//把打印设备环境附加到DC对象DOCINFO di; di.cbSize = sizeof(DOCINFO);di.lpszDocName = "SimplePrintDoc";di.lpszOutput = NULL;di.lpszDatatype = NULL;di.fwType = 0;dc.StartDoc(&di); //通知打印机驱动程序执行一新的打印任务dc.StartPage();//通知打印机驱动程序打印新页dc.SetMapMode(MM_HIENGLISH);//设置当前影射模式为:单位0.001英寸//X方向向右增加,Y方向向上增加CRect rectPrint(0, 0,dc.GetDeviceCaps(HORZRES),//返回设备的.以毫米为单位的物理显示宽度 dc.GetDeviceCaps(VERTRES));//返回设备的.以毫米为单位的物理显示高度dc.DPtoLP(&rectPrint);//设备物理单位转化为逻辑单位dc.SetWindowOrg(0, -rectPrint.bottom);//设置原点CFont font;VERIFY(font.CreatePointFont(120, "Arial", &dc));//为DC创建字体CFont* def_font = dc.SelectObject(&font);//保存现在的字体dc.SetTextAlign(TA_TOP|TA_LEFT);CString s = m_strPrintString; //要打印的字符串(注意有长度的限制)s = "\n"; //必须增加一个换行符号(因为后面while循环的要求)CString ss;int index;CSize size;int x = 300;int y = 9000;//注意原点位置和坐标增加的方向size = dc.GetTextExtent("00", 2);//计算使用当前字体输出时文本所占大小、宽 度while((index = s.Find("\n")) != -1){ss = s.Left(index);if(ss.Find("\r") != -1)//输入的字符串有回车符ss = s.Left(index-1);s = s.Mid(index 1);//取剩余的字符串 // AfxMessageBox("A" ss "A");dc.TextOut(x, y, ss);//打印到缓冲区y -= size.cy;}dc.SelectObject(def_font); //恢复原来的字体font.DeleteObject(); dc.EndPage(); //通知打印机驱动程序页结束dc.EndDoc();//通知打印机驱动程序打印完毕DeleteDC(dc.Detach()); } 程序代码很简单,一看就明白,我想应该适合大多数的简单打印场合吧。另外,这个例子对于初学Windows编程的朋友来说,无疑也是一个理解Windows设备无关特性的好实例。 如果大家有更好更简便的、功能强大的方法请告诉我:vc.faq@263.net
通过MFC来完成打印作业有很多的方法,应用场合也有所不同。我们通常是利用视图框架在MFC基础之上按照OnPreparePrinting() à OnBeginPrinting() ? à OnPreprareDC() à OnPrinting () à OnEndPrinting()的顺序来编程的。对于我们使用单文档或者多文档的视图框架时这无疑是一种很好的方式。但是,在基于对话框的应用程序中,或者在很多打印要求不高的情况下(如只是简单的打印中间计算结果、报告程序异常等),我们就没有必要再绕上面的那么一个大弯子,可以直接利用MFC封装的打印对话框CPrintDialog来执行简单的打印任务。当然,如果你不怕烦,这种方式也可以执行很复杂的打印作业。 下面做一个简单的例子程序。利用Visual C 6.0 的AppWizard生成一个对话框应用程序框架。然后,利用资源编辑器添加一个Edit控件,属性设置为:选择Multiline、Want Return ,根据你的兴趣选择滚动条有关的项,绑定成员变量m_strPrintString。使“确定(OK)”按钮不接受程序的“Enter”键消息,Caption改为“打印(Print)”。此键按下的处理函数如下:if (!UpdateData(TRUE)){AfxMessageBox("数据交换有误!");}if (m_strPrintString==_T("")){AfxMessageBox("请输入需要打印的文字?quot;);return;}CPrintDialog dlg(FALSE,PD_NOPAGENUMS|PD_NOSELECTION,this);if(dlg.DoModal() == IDOK){CDC dc;dc.Attach(dlg.GetPrinterDC());//把打印设备环境附加到DC对象DOCINFO di; di.cbSize = sizeof(DOCINFO);di.lpszDocName = "SimplePrintDoc";di.lpszOutput = NULL;di.lpszDatatype = NULL;di.fwType = 0;dc.StartDoc(&di); //通知打印机驱动程序执行一新的打印任务dc.StartPage();//通知打印机驱动程序打印新页dc.SetMapMode(MM_HIENGLISH);//设置当前影射模式为:单位0.001英寸//X方向向右增加,Y方向向上增加CRect rectPrint(0, 0,dc.GetDeviceCaps(HORZRES),//返回设备的.以毫米为单位的物理显示宽度 dc.GetDeviceCaps(VERTRES));//返回设备的.以毫米为单位的物理显示高度dc.DPtoLP(&rectPrint);//设备物理单位转化为逻辑单位dc.SetWindowOrg(0, -rectPrint.bottom);//设置原点CFont font;VERIFY(font.CreatePointFont(120, "Arial", &dc));//为DC创建字体CFont* def_font = dc.SelectObject(&font);//保存现在的字体dc.SetTextAlign(TA_TOP|TA_LEFT);CString s = m_strPrintString; //要打印的字符串(注意有长度的限制)s = "\n"; //必须增加一个换行符号(因为后面while循环的要求)CString ss;int index;CSize size;int x = 300;int y = 9000;//注意原点位置和坐标增加的方向size = dc.GetTextExtent("00", 2);//计算使用当前字体输出时文本所占大小、宽 度while((index = s.Find("\n")) != -1){ss = s.Left(index);if(ss.Find("\r") != -1)//输入的字符串有回车符ss = s.Left(index-1);s = s.Mid(index 1);//取剩余的字符串 // AfxMessageBox("A" ss "A");dc.TextOut(x, y, ss);//打印到缓冲区y -= size.cy;}dc.SelectObject(def_font); //恢复原来的字体font.DeleteObject(); dc.EndPage(); //通知打印机驱动程序页结束dc.EndDoc();//通知打印机驱动程序打印完毕DeleteDC(dc.Detach()); } 程序代码很简单,一看就明白,我想应该适合大多数的简单打印场合吧。另外,这个例子对于初学Windows编程的朋友来说,无疑也是一个理解Windows设备无关特性的好实例。 如果大家有更好更简便的、功能强大的方法请告诉我:vc.faq@263.net
下载本文示例代码
MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法MFC简单打印方法
阅读(200) | 评论(0) | 转发(0) |