欢迎来到天天文库
浏览记录
ID:19512546
大小:366.00 KB
页数:13页
时间:2018-10-03
《c 程序中动态增加更新自定义纸型的方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、窗体顶端解决在C#程序中动态增加/更新自定义纸型的方法 解决打印时,程序中动态添加纸型的问题是C#中常见的难题,为了避免大家也走我一样的弯路,特将我的解决过程分享出来。 在写过大量C#代码后,大家都有一种同感,C#类库功能极其强大,但总有部分不足。在前不久,为了满足众多客户对打印格式和纸型要求并不完全一致的需求,花了N个夜晚做了个的自定义套打的工具集,主要功能包括:定制数据源(由朋友http://blog.csdn.net/windcsn/完成),根据数据源定制打印模板,根据打印模板和数据源参数进行打印。
2、 当然这里的重点不是说明该程序的功能。这里是说明如何在C#中更有效的方法增加自定义纸型。 刚开始我所想到的方法应当是大家都能想到的方法:就是使用DllImport. 经过多次寻找,我找到了一个专门提供系统API在VB/VB.net/C#中使用的网址: http://www.webtropy.com/articles/art9-1.asp 在这里提供了AddForm,DeleteForm等打印专用的API的DllImport方法, 同时参考在微软网站上的打印纸型增加的方法: 如何在Wi
3、ndowsNT和Windows2000中使用自定义页面大小打印 文章内代码全是VB写的,无法在C#中直接使用,怎么办呢?改造成C#吧。 接下来就是改造过程,有一大堆的结构体要转换,还有一大堆的API要定义。苦啊,也罢问题能解决不就得了。 等等。这里有这么两段: CallCopyMemory(aFI1(0),Temp(0),BytesNeeded) CallCopyMemory(aDevMode(1),pDevMode,Len(pDevMode)) 晕,如何转CopyMemory呢?在C
4、++中使用指针对我来说,并没有什么困难,但在C#中,想使用指针还真费手脚。继续还是放弃? 暂时放弃吧,原因是VB也可以写COM的。而COM在C#中使用比较简单,说干就干,开始使用MS的代码用VB写ATL控件,忙了半天,终于出来了,呵呵,主要是删截代码。 在C#中成功引用,并写出使用的代码,结果提示说类型不匹配?什么地方类型不匹配呢?无法跟踪,痛苦。再次放弃。 重新回到C#的DllImport上,研究IntPtr等,结果还是有种很难受的感觉。怎么办呢?郁闷了两天,那两天可是周末的两天啊。 经过两天痛
5、苦之后,周一时重新理了下思路,还是从COM的路。不过换方向,使用VC++吧。 先定义了三个方法: Add,Remove,Update,对我来说这三个方法已经足够了 Add用于增加纸型,Remove用于删除纸型,Update当然是更新纸型大小了。 用C++写起来就是爽啊。很快几个方法就写好了。 放在C#代码中一试,增加纸型成功。 在打印机的纸型列表中一看,没有?真是奇怪了。这是怎么回事呢? 查询MSDN中关于FORM_INFO_1的说明, pNamePointertoanull-
6、terminatedstringthatspecifiesthenameoftheform.SizeSpecifiesthewidthandheight,inthousandthsofmillimeters,oftheform.ImageableAreaSpecifiesthewidthandheight,inthousandthsofmillimeters,oftheform. 原来如此,我使用的代码中定义的自以为是1/100英寸为单位的,因为C#类中说明PageSize的大小是以1/100吋为单位的。
7、这里尽然是1/1000毫米,真是气坏我了。到此,问题全部解决,纸型定义成功。 部分代码: 1// Paper.cpp : CPaper 的实现 2 3#include "stdafx.h" 4#include "Paper.h" 5#include ".paper.h" 6#include 7#include 8#include 9#pragma comment(lib, "comsupp.lib") 10
8、11#ifndef CNW_DEBUG 12#define CNW_DEBUG 13#endif 14 15// CPaper 16namespace CNetware 17{ 18 19STDMETHODIMP CPaper::Add(IN BSTR printerName,IN BSTR paperName, IN LONG width,IN LONG heigh
此文档下载收益归作者所有