中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > .NET > .NET Framework
在控制台应用程序中实现打印
作者:yestar2000 时间:2002-01-23 12:09 出处:互联网 责编:chinaitpower
              摘要:在控制台应用程序中实现打印
你是否厌倦了将从控制台应用程序中选出的文本打印出来?这里将介绍一种方便的工具来帮你实现打印。
by Bill Wagner

我在以前的一篇文章中曾介绍到过如何从控制台命令中捕获输出结果并将它放到剪贴板中。我常常需要从一些控制台命令中将文本输出结果打印出来,因此我对最后的例子进行了修改以使它支持打印。

.NET打印框架对于使用MFC的人来说并不陌生:你只需建立一个PrintDocument对象并调用其Print()方法就行。PrintDocument对象会调用你建立的事件处理来打印每个页面。打印完所有页面之后,打印处理会设置一个标记并结束打印。

在这个新的例子中,我做了三个地方的改动。首先,我修改了存储方法(storage)以便将被捕获的输入保存在一个ArrayList中,输入的每一行都成为该集合中的一个字符串:
private void grabStream (TextReader inStream)
{
  string str;
  while (null != (str = inStream.ReadLine ()))
  {
    listOStrings.Add (str);
    // Pipe it to the output:
    System.Console.WriteLine (str);
  }
}

接下来,我添加了一些命令行选项以使它能够将数据发送到剪贴板中或缺省的打印机上,或者同时发送到这两处(见列表1)。

最后,我写了两个程序来将输出结果打印出来(见列表2)。PrintData()方法用于建立一个PrintDocument对象并启动该打印过程。它还负责为打印页面处理添加事件处理程序。

PrintPage()方法用于打印每个页面。首先,我计算出符合打印页面的行数。字体的GetHeight()方法显示了单独一行的高度,PrintPageEvent的Marginbounds属性显示了每个页面的打印空间有多大。有了这些信息,我便可以简单地绘制出页眉行、页面的每一行以及页脚行。

在打印框架中有一个小问题:PageBounds属性代表的是整个页面的大小,而不是可打印区域的大小。我曾试图将页眉和页脚限定在打印区域以外,但没有成功。在有些打印机上,打印区域以下的地方是不能被打印出来的。所以我只能简单地调整页边距并将页眉和页脚放在打印区域中。


关于作者:
 
 

Bill Wagner是SRT Solutions的Windows技术专家。他是Visual Studio Magazine的撰稿编辑,也是The C# Core Language Little Black Book一书的作者,这是一本C#开发人员的高级参考书。在16年的软件开发实践中,Bill在许多项目中都是重要的开发人员。他曾为工程和商务应用程序、桌面和Web环境开发过软件。他在2D和3D图象和多媒体软件方面也很有经验,包括为The Lion King Animated Storybook开发的视频回放引擎。他的联系方式是wwagner@SRTSolutions.com

 

 

 

过程选项

列表1.该程序用于解析命令行以及存储所有命令行选项和该类的成员变量(member variable)中的输入文件。
private int parseArgs (string [] args)
{
  for (int index = 0; index < args.Length; 
	index++) 
  {
    string arg = args[index];
    if ('-' == arg[0]) 
    {
      switch (arg[1]) 
      {
        case 'h':
          // Help Me:
          PrintHelpMessage ();
          return 0;
        case 'c':
          // Copy to clipboard.
          setClipboard = true;
          break;
        case 'p':
          printData = true;
          break;
        default:
          // Ooops.
          Console.Error.WriteLine 
				("Invalid Argument: {0}", arg);
          PrintHelpMessage ();
          return 2;
      }
    } 
    else
      this.inFile = arg;
    // If there were no options, set the 
	// clipboard data:
    if (!(setClipboard || printData))
      setClipboard = true;
  }
  return 0;
}

Print Page事件处理和Print程序

列表2. Print Page事件处理负责将一个单独输出结果页面发送到打印机中。Print程序启动打印过程。
private void PrintPage(object sender, 
	PrintPageEventArgs ev) 
{
  float linesPerPage = 0;
  float yPos = 0;
  int count = 0;
  float leftMargin = ev.MarginBounds.Left;
  float topMargin = ev.MarginBounds.Top;
  string line = null;

  // Calculate the number of lines per page.
  linesPerPage = ev.MarginBounds.Height / 
    printFont.GetHeight(ev.Graphics)-2;

  // Print the header:
  string header = inFile;
  if (header == null)
    header = "Standard input";
  StringFormat fmt = new StringFormat(StringFormatFlags.NoWrap);
  fmt.Alignment = StringAlignment.Center;
  fmt.LineAlignment = StringAlignment.Center;
  Rectangle rcHeader = new Rectangle 
	(ev.MarginBounds.Left, ev.MarginBounds.Top,
    ev.MarginBounds.Width, 
	(int)(printFont.GetHeight (ev.Graphics)+1));
  ev.Graphics.DrawString(header, printFont, 
	Brushes.Black, rcHeader, fmt);

  topMargin += rcHeader.Height;

  // Print each line of the file.
  while((count < linesPerPage) && 
    (currentLineToPrint < listOStrings.Count)) 
  {
    line = (string) listOStrings[currentLineToPrint];
    yPos = topMargin + (count * 
      printFont.GetHeight(ev.Graphics));
    ev.Graphics.DrawString(line, printFont, 
		Brushes.Black, leftMargin, yPos, 
		new StringFormat());
    count++;
    currentLineToPrint++;
  }

  // Print the footer:
  string footer = "Page " + currentPage.ToString() + " of " +
    Math.Ceiling ((double)listOStrings.Count / 
		(double) linesPerPage);
  rcHeader.Y = (int)(topMargin + 
	(linesPerPage+1)* 
    printFont.GetHeight(ev.Graphics));
  rcHeader.Height = (int)(printFont.GetHeight 
	(ev.Graphics) + 1);
  ev.Graphics.DrawString(footer, printFont, 
	Brushes.Black, rcHeader, fmt);
  currentPage++;

  // If more lines exist, print another page.
  if(currentLineToPrint < listOStrings.Count)
    ev.HasMorePages = true;
  else
    ev.HasMorePages = false;
}

private void PrintData ()
{
  printFont = new Font("Arial", 10);
  PrintDocument pd = new PrintDocument();
  pd.PrintPage += new PrintPageEventHandler
    (this.PrintPage);
  // Reset the page number and the current line.
  currentLineToPrint = 0;
  currentPage = 1;
  pd.Print();
}

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有