C#程序中动态增加更新自定义纸型的方法.docVIP

C#程序中动态增加更新自定义纸型的方法.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
窗体顶端 解决在C#程序中动态增加/更新自定义纸型的方法 ??? 解决打印时,程序中动态添加纸型的问题是C#中常见的难题,为了避免大家也走我一样的弯路,特将我的解决过程分享出来。 ??? 在写过大量C#代码后,大家都有一种同感,C#类库功能极其强大,但总有部分不足。 在前不久,为了满足众多客户对打印格式和纸型要求并不完全一致的需求,花了N个夜晚做了个的自定义套打的工具集,主要功能包括:定制数据源(由朋友/windcsn/完成),根据数据源定制打印模板,根据打印模板和数据源参数进行打印。 ??? 当然这里的重点不是说明该程序的功能。这里是说明如何在C#中更有效的方法增加自定义纸型。 ??? 刚开始我所想到的方法应当是大家都能想到的方法:就是使用DllImport. ??? 经过多次寻找,我找到了一个专门提供系统API在VB/VB.net/C#中使用的网址: ??? /articles/art9-1.asp ??? 在这里提供了AddForm,DeleteForm等打印专用的API的DllImport方法, ??? 同时参考在微软网站上的打印纸型增加的方法: ????如何在 Windows NT 和 Windows 2000 中使用自定义页面大小打印 ???? ??? 文章内代码全是VB写的,无法在C#中直接使用,怎么办呢?改造成C#吧。 ??? 接下来就是改造过程,有一大堆的结构体要转换,还有一大堆的API要定义。苦啊,也罢问题能解决不就得了。 ??? 等等。这里有这么两段: ?? Call CopyMemory(aFI1(0), Temp(0), BytesNeeded) ?? Call CopyMemory(aDevMode(1), pDevMode, Len(pDevMode)) ??? 晕,如何转CopyMemory呢?在C++中使用指针对我来说,并没有什么困难,但在C#中,想使用指针还真费手脚。继续还是放弃? ??? 暂时放弃吧,原因是VB也可以写COM的。而COM在C#中使用比较简单,说干就干,开始使用MS的代码用VB写ATL控件,忙了半天,终于出来了,呵呵,主要是删截代码。 ???在C#中成功引用,并写出使用的代码,结果提示说类型不匹配?什么地方类型不匹配呢?无法跟踪,痛苦。再次放弃。 ??? 重新回到C#的DllImport上,研究IntPtr等,结果还是有种很难受的感觉。怎么办呢?郁闷了两天,那两天可是周末的两天啊。 ??? 经过两天痛苦之后,周一时重新理了下思路,还是从COM的路。不过换方向,使用VC++吧。 ??? 先定义了三个方法: ??? Add,Remove,Update,对我来说这三个方法已经足够了 ??? Add用于增加纸型,Remove用于删除纸型,Update当然是更新纸型大小了。 ??? 用C++写起来就是爽啊。很快几个方法就写好了。 ??? 放在C#代码中一试,增加纸型成功。 ????在打印机的纸型列表中一看,没有?真是奇怪了。这是怎么回事呢? ????查询MSDN中关于FORM_INFO_1的说明, ??? pName Pointer to a null-terminated string that specifies the name of the form. Size Specifies the width and height, in thousandths of millimeters, of the form. ImageableArea Specifies the width and height, in thousandths of millimeters, of the form. ????? 原来如此,我使用的代码中定义的自以为是1/100英寸为单位的,因为C#类中说明PageSize的大小是以1/100吋为单位的。这里尽然是1/1000毫米,真是气坏我了。 到此,问题全部解决,纸型定义成功。 ???? 部分代码: ????? ??1//?Paper.cpp?:?CPaper?的实现 ??2 ??3#include?stdafx.h ??4#include?Paper.h ??5#include?.\paper.h ??6#include?comutil.h ??7#include?Windows.h ??8#include?iostream ??9#pragma?comment(lib,?comsupp.lib) ?10 ?11#ifndef?CNW_DEBUG ?12#define?CNW_DEBUG ?13#endif ?14 ?15//?CPaper ?16namespace?CNetware ?17{ ?18 ?19STDMETHOD

您可能关注的文档

文档评论(0)

精华文档888 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档