找回密码
 立即注册

QQ登录

只需一步,快速开始

ZenosZeng 讲师达人认证 悬赏达人认证

超级版主

299

主题

7874

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
13131

活字格认证圣诞拼拼乐微信认证勋章讲师达人元老葡萄悬赏达人

ZenosZeng 讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-7-10 17:49  /   查看:6387  /  回复:0
在实际中,我们经常需要将文档中的多页内容同时打印在一张纸上,有的打印机支持这种打印方式,并可以通过调整打印机的设置来完成。不过这种方法依赖于特殊的打印机类型,开发人员并不能干预这个打印过程。
print.png

本文中的例子主要演示如何利用TX TextControl控件,实现将文档中的多页内容同时打印到一张纸上。

首先,TX TextControl的也渲染引擎将文档中的每一页进行单独的渲染,并将每一页的渲染结果存放到一个Metafile类型的数组中,代码如下:
  1.     // create a metafile array of all TX Text Control pages
  2.     mfPageImages = new Metafile[textControl1.Pages];
  3.     int iCounter = 0;

  4.     foreach (TXTextControl.Page page in textControl1.GetPages())
  5.     {
  6.         mfPageImages.SetValue(page.GetImage(TXTextControl.Page.PageContent.All), iCounter);
  7.         iCounter++;
  8.     }
复制代码


然后创建一个PrintDocument的实例,并添加相应的事件:
  1.     // create a new print document that is manipulated in the PrintPage event
  2.     PrintDocument pd = new PrintDocument();
  3.     pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
  4.     pd.QueryPageSettings += new QueryPageSettingsEventHandler(pd_QueryPageSettings);
  5.     pd.BeginPrint += new PrintEventHandler(pd_BeginPrint);
复制代码


在PrintPage事件中,文档中的4页内容将会被打印到纸张上的不同位置,每页内容的缩放比例根据实际页面宽度和页边距计算出来的:
  1.     // calculate the scale factor based on the current paper size
  2.     iThumbWidth = (int)(((e.PageSettings.PaperSize.Width - iPageMargin) * fDpi) / 2);
  3.     dScaleFactor = ((float)(iThumbWidth) / (float)(mfPageImages[0].Size.Width));
复制代码


通过这种方法的好处在于,所有的画操作并不需要进行手动调整缩放比例,下面代码展示了如何绘制元文件:
  1.     // draw the metafile
  2.     g.DrawImage(mfPageImages[iPrintPageCounter], 0F, 0F, sfImageSize.Width, sfImageSize.Height);
复制代码


接下来,将通过TranslateTransform方法来改变下一页绘制的横纵起始坐标:
  1.     // transform the matrix to move the next page
  2.     switch (i)
  3.     {
  4.         // upper right
  5.         case 0:
  6.             g.TranslateTransform(sfImageSize.Width, 0);
  7.             break;
  8.         // lower left
  9.         case 1:
  10.             g.TranslateTransform(-sfImageSize.Width, sfImageSize.Height);
  11.             break;
  12.         // lower right
  13.         case 2:
  14.             g.TranslateTransform(sfImageSize.Width, 0);
  15.             break;
  16.     }
复制代码


源码下载:VS2010 + TX TextControl 17.0
tx_print_handouts.zip (561.05 KB, 下载次数: 628)

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部