通过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设备无关特性的好实例。
分享到:
评论