通过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设备无关特性的好实例。
分享到:
相关推荐
花了一个星期,研究了网上大量的MFC对话框打印及打印预览功能的demo之后,选中了几个版本,合并修改,得到这个比较完美的版本(真心花了时间,功能上都实现了,也没有什么崩溃的问题)。其中几个打印具体内容的地方...
MFC的打印是一个难点,想在对话框程序中进行打印就更难,我在学习时参考了别人的代码,详细标注制作了一个基本打印示例。 void CTestDlg::OnOK() { // 最简单的打印示例 // 建立一个基于对话框的应用程序,将...
使用MFC实现打印功能,对了解MFC基本功能框架和编程都有很好的借鉴学习作用,程序虽然简单但是麻雀虽小五脏俱全
opengl 雪花 无MFC 简单,是一个非常初级的opengl编程。
简单的MFC程序控制word2003,可用表格控制布局实现文字和图片的布局,并最终实现打印,应用前可安装smartprint虚拟打印机(压缩包中有该软件),本程序适合新手上手了解
MFC 打印程序源代码 非文档节够,可以直接进行简单的演示
MFC操作默认打印机打印简单语句
基于对话框的简单打印相关程序 能够运行 API相关函数
简单的基于MFC dialog的控制打印机打印,打印一行文字,不出现预览界面
如果做到以下几点,你就可以成为一位透彻理解MFC实现细节的专家:探索MFC文档/视图结构的内幕,从而学习视图同步、打印和打印预览;更深入地了解MFC序列化中那些没有文档记录的方面和一些没有文档记录的类,例如...
简单的mfc的画图工具的源代码,含有文档说明和ppt
兄弟MFC-9465CDN一体机驱动程序是一款...兄弟MFC-9465CDN是一款操作简单、打印速度快、功能齐全、耗材成本低的特点,拥有打印、复印、扫描、传真等功能,并拥有自动双面打印和有线网络打印的特点。121down小编提供的
第7章 简单而完整:mfc骨干程序 第四篇 深入mfc程序设计 第8章 document-view深入探讨 第9章 消息映射与命令传递 第10章 mfc与对话盒 第12章 打印与预览 第13章 多重文件与多重显示 第14章 mfc多线程...
MFC打印程序,C++代码,比较简单的,适合初级程序员
此示例简单而有效地演示了 MFC 的诸多功能: 应用程序对象 文档、视图和文档模板 命令、消息映射和命令用户界面更新 MDI(多文档界面)框架和子窗口 工具栏和状态栏 从文档到视图的更新提示 ...
本书的作者,jeff prosise,用其无与伦比的技巧向读者讲述了mfc程序设计中的基本概念和主要技术——再次阐释了在32位windows平台上进行了快速的面向对象开发的完美方法。 本书涵盖了以下专题: 事件驱动程序设计...
MFC库按照应用功能划分为根类,MFC应用结构类,窗口、对话和控件类,绘画和打印类,简单的数据类型类,数组、列表和映射类,文件和数据库类,Internet和网络类,OLE类,调试和异常类等类。而其中的每一分类都是应用...
提供简单的打印条形码的程序,在此,只提供VIEW里的代码,其他源程序需自己改写。