在控制台应用程序中实现打印

发表于:2007-05-25来源:作者:点击数: 标签:打印控制台应用程序实现
你是否厌倦了将从控制台应用程序中选出的文本打印出来?这里将介绍一种方便的工具来帮你实现打
你是否厌倦了将从控制台应用程序中选出的文本打印出来?这里将介绍一种方便的工具来帮你实现打印。
by Bill Wagner

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

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

在这个新的例子中,我做了三个地方的改动。首先,我修改了存储方法(storage)以便将被捕获的输入保存在一个ArrayList中,输入的每一行都成为该集合中的一个字符串:

clearcase/" target="_blank" >cc>
private void grabStream (TextReader inStream)
{
  string str;
  while (null != (str = inStream.ReadLine ()))
  {
    listOStrings.Add (str);
    // Pipe it to the output:
    System.Console.WriteLine (str);
  }
}

接下来,我添加了一些命令行选项以使它能够将数据发送到剪贴板中或缺省的打印机上,或者同时发送到这两处(见javascript:openWindowRes('VS/2003_02/xml2html.asp?xmlfile=ConsoleApplication/List1.xml&xslfile=../../include/xsl/Mylist.xsl');">列表1)。

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

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

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


关于作者:
 
 

Bill Wagner是SRT SolutionsWindows技术专家。他是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();
}

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)