问题描述
如何在visualstudio2005通过button打印textbox的内容
解决方案
解决方案二:
在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft.netFramework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下。打印操作通常包括以下四个功能1打印设置设置打印机的一些参数比如更改打印机驱动程序等2页面设置设置页面大小纸张类型等3打印预览类似于word中的打印预览4打印下面我把我编写的记事本(全部源代码可以在http://www.cndot.net中下载)中用到的打印功能的代码进行解释希望能给大家一些帮助实现打印功能的核心是PrintDocument类这个类属于System.Drawing.Printing名字空间这个类封装了当前的打印设置页面设置以及所有的与打印有关的事件和方法这个类包括以下几个属性事件和方法1、PrinterSettings属性存放打印机的设置信息这个属性不需要程序员设置因为它是由打印对话框获取的2、PrintCountroller属性控制打印过程3、DefaultPageSettings属性存放页面设置信息打印纸大小方向等也不需要程序员设置因为它是由页面设置对话框获取的4、DocumentName属性指定文档名称,出现在打印机状态窗口中1。BeginPrint事件在打印之前发出2.PrintPage事件每打印一页是发出,事件接受一个PrintPageEventArgs参数该参数封装了打印相关的信息PrintPageEventArgs参数有很多重要的属性1Cancel取消打印2Graphics页面的绘图对象3HasMorePages是否还有要打印的页面Print方法该方法没有参数调用它将按照当前设置开始打印若实现打印功能首先构造PrintDocument对象添加打印事件PrintDocumentprintDocument;privatevoidInitializeComponent(){...printDocument=newPrintDocument();printDocument.PrintPage+=newPrintPageEventHandler(this.printDocument_PrintPage);...}实现打印事件功能打印和绘图类似都是调用Graphics类的方法进行画图不同的是一个在显示器上一个在打印纸上并且打印要进行一些复杂的计算如换行分页等。privatevoidprintDocument_PrintPage(objectsender,PrintPageEventArgse){Graphicsg=e.Graphics;//获得绘图对象floatlinesPerPage=0;//页面的行号floatyPosition=0;//绘制字符串的纵向位置intcount=0;//行计数器floatleftMargin=e.MarginBounds.Left;//左边距floattopMargin=e.MarginBounds.Top;//上边距stringline=null;行字符串FontprintFont=this.textBox.Font;//当前的打印字体SolidBrushmyBrush=newSolidBrush(Color.Black);//刷子linesPerPage=e.MarginBounds.Height/printFont.GetHeight(g);//每页可打印的行数//逐行的循环打印一页while(count<linesPerPage&&((line=lineReader.ReadLine())!=null)){yPosition=topMargin+(count*printFont.GetHeight(g));g.DrawString(line,printFont,myBrush,leftMargin,yPosition,newStringFormat());count++;}如果本页打印完成而line不为空说明还有没完成的页面这将触发下一次的打印事件在下一次的打印中lineReader会自动读取上次没有打印完的内容因为lineReader是这个打印方法外的类的成员它可以记录当前读取的位置if(line!=null)e.HasMorePages=true;elsee.HasMorePages=false;}打印设置,构造打印对话框将对话框中设置的Document属性赋给printDocument这样会将用户的设置自动保存到printDocument的PrinterSettings属性中protectedvoidFileMenuItem_PrintSet_Click(objectsender,EventArgse){PrintDialogprintDialog=newPrintDialog();printDialog.Document=printDocument;printDialog.ShowDialog();}页面设置和打印预览与打印设置原理相同都是构造对话框将用户在对话框中的设置保存到相应的类的属性中protectedvoidFileMenuItem_PageSet_Click(objectsender,EventArgse){PageSetupDialogpageSetupDialog=newPageSetupDialog();pageSetupDialog.Document=printDocument;pageSetupDialog.ShowDialog();}打印预览protectedvoidFileMenuItem_PrintView_Click(objectsender,EventArgse){PrintPreviewDialogprintPreviewDialog=newPrintPreviewDialog();printPreviewDialog.Document=printDocument;lineReader=newStringReader(textBox.Text);try{printPreviewDialog.ShowDialog();}catch(Exceptionexcep){MessageBox.Show(excep.Message,"打印出错",MessageBoxButtons.OK,MessageBoxIcon.Error);}}打印就可以直接调用printDocument的Print()方法因为用户可能在打印之前还要再更改打印设置所以在这里再次显示打印设置对话框protectedvoidFileMenuItem_Print_Click(objectsender,EventArgse){PrintDialogprintDialog=newPrintDialog();printDialog.Document=printDocument;lineReader=newStringReader(textBox.Text);if(printDialog.ShowDialog()==DialogResult.OK){try{printDocument.Print();}catch(Exceptionexcep){MessageBox.Show(excep.Message,"打印出错",MessageBoxButtons.OK,MessageBoxIcon.Error);printDocument.PrintController.OnEndPrint(printDocument,newPrintEventArgs());}}}总结打印的过程是1在应用程序窗体初始化时构造PrintDocument对象添加printDocument的PrintPage方法2实现PrintPage方法4在用户的单击事件中调用printDocument的Print方法实现打印功能在这中间可能要用到PrintDialogPrintPreviewDialogPageSetupDialog设置和查看打印效果这些方法通常是由菜单的单击触发的。