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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

解决在C#程序中动态增加/更新自定义纸型的方法解决打印时,程序中动态添加纸型的问题是C#中常见的难题,为了避免大家也走我一样的弯路,特将我的解决过程分享出来。在写过大量C#代码后,大家都有一种同感,C#类库功能极其强大,但总有部分不足。在前不久,为了满足众多客户对打印格式和纸型要求并不完全一致的需求,花了N个夜晚做了个的自定义套打的工具集,主要功能包括:定制数据源(由朋友完成),根据数据源定制打印模板,根据打印模板和数据源参数进行打印。当然这里的重点不是说明该程序的功能。这里是说明如何在C#中更有效的方法增加自定义纸型。刚开始我所想到的方法应当是大家都能想到的方法:就是使用DllImport.经过多次寻找,我找到了一个专门提供系统API在VB/VB.net/C#中使用的网址:在这里提供了AddForm,DeleteForm等打印专用的API的DllImport方法,同时参考在微软网站上的打印纸型增加的方法:如何在WindowsNT和Windows2000中使用自定义页面大小打印文章内代码全是VB写的,无法在C#中直接使用,怎么办呢?改造成C#吧。接下来就是改造过程,有一大堆的结构体要转换,还有一大堆的API要定义。苦啊,也罢问题能解决不就得了。等等。这里有这么两段:CallCopyMemory(aFI1(0),Temp(0),BytesNeeded)CallCopyMemory(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的说明,pNamePointertoanull-terminatedstringthatspecifiesthenameoftheform.SizeSpecifiesthewidthandheight,inthousandthsofmillimeters,oftheform.ImageableAreaSpecifiesthewidthandheight,inthousandthsofmillimeters,oftheform.原来如此,我使用的代码中定义的自以为是1/100英寸为单位的,因为C#类中说明PageSize的大小是以1/100吋为单位的。这里尽然是1/1000毫米,真是气坏我了。到此,问题全部解决,纸型定义成功。部分代码:1//Paper.cpp:CPaper的实现23#includestdafx.h4#includePaper.h5#include.\paper.h6#includecomutil.h7#includeWindows.h8#includeiostream9#pragmacomment(lib,comsupp.lib)1011#ifndefCNW_DEBUG12#defineCNW_DEBUG13#endif1415//CPaper16namespaceCNetware17{1819STDMETHODIMPCPaper::Add(INBSTRprinterName,INBSTRpaperName,INLONGwidth,INLONGheight,LONG*ret)20{21char*strPrinterName=_com_util::ConvertBSTRToString(printerName);22char*strPaperName=_com_util::ConvertBSTRToString(paperName);23HANDLEpPrinter;24*ret=OpenPrinter(strPrinterName,&pPrinter,NULL);2526if(*ret==FALSE)gotoEND_ADD;27if(GetIndex(pPrinter,strPaperName)!=-1)28{29ClosePrinter(pPrinter);30*ret=FALSE;31gotoEND_ADD;32}3334FORM_INFO_1aFI1;35aFI1.Flags=0;36aFI1.pName=strPaperName;37aFI1.Size.cx=width;38aFI1.Size.cy=height;39aFI1.ImageableArea.left=0;40aFI1.ImageableArea.top=0;41aFI1.ImageableArea.right=width;42aFI1.ImageableArea.bottom=height;4344*ret=AddForm(pPrinter,1,(LPBYTE)&aFI1);45ClosePrinter(pPrinter);4647END_ADD:48if(*ret==FALSE)returnS_FALSE;49returnS_OK;50}51intCPaper::GetIndex(HANDLEhPrinter,LPSTRpaperName)52{53DWORDdwNeeded,dwReturned;54FORM_INFO_1*aFI1;55BOOLbret;56BYTE*TEMP;57intindex=-1;5859aFI1=(FORM_INFO_1*)newBYTE[sizeof(FORM_INFO_1)];60bret=EnumForms(hPrinter,1,(LPBYTE)&aFI1[0],0,&dwNeeded,&dwReturned);61delete[](BYTE*)aFI1;62TEMP=newBYTE[dwNeeded];63aFI1=(FORM_INFO_1*)newBYTE[dwNeeded];64bret=EnumForms(hPrinter,1,TEMP,dwNeeded,&dwNeeded,&dwReturned);6566CopyMemory(aFI1,TEMP,dwNeeded);6768for(inti=0;i(int)dwReturned;i++)69{70if(strcmp(aFI1[i].pName,paperName)==0)71{72index=i;73break;74}75}76delete[](BYTE*)TEMP;77delete[](BYTE*)aFI1;7879returnindex;80}81STDMETHODIMPCPaper::Remove(BSTRprinterName,BSTRpaperName,LONG*ret)82{83HANDLEpPrinter=NULL;8485char*strPrinterName=_com_util::ConvertBSTRToString(printerName);86char*strPaperName=_com_util::ConvertBSTRToString(paperName);87*ret=OpenPrinter(strPrinterName,&pPrinter,NULL);88if(*ret==FALSE||pPrinter==NULL)89{90gotoEND_REMOVE;91}92if(GetIndex(pPrinter,strPaperName)==-1)93{94ClosePrinter(pPrinter);95*ret=TRUE;96gotoEND_REMOVE;97}9899*ret=DeleteForm(pPrinter,strPaperName);100ClosePrinter(pPrinter);101END_REMOVE:102if(*ret==FALSE)returnS_FALSE;103returnS_OK;104}105106STDMETHODIMPCPaper::Update(BSTRprinterName,BSTRpaperName,LONGwidth,LONGheight,LONG*ret)107{108//TODO:在此添加实现代码109Remove(printerName,paperName,ret);110if(*ret==FALSE)returnS_FALSE;111Add(printerName,paperName,width,height,ret);112if(*ret==FALSE)returnS_FALSE;113returnS_OK;114}115116}1171//Paper.h:CPaper的声明23#pragmaonce4#includeresource.h//主符号5#includeWinuser.h67namespaceCNetware8{9101112//IPaper13[14object,15uuid(4BCEEB5C-F384-4424-B961-FB7B1214D871),16dual,helpstring(IPaper接口),17pointer_default(unique)18]19__interfaceIPaper:IDispatch20{21[id(1),helpstring(方法AddPaper)]HRESULTAdd([in]BSTRprinterName,[in]BSTRpaperName,[in]LONGwidth,[in]LONGheight,[out,retval]LONG*ret);22[id(2),helpstring(方法Remove)]HRESULTRemove([in]BSTRprinterName,[in]BSTRpaperName,[out,retval]LONG*ret);23[id(3),helpstring(方法Update)]HRESULTUpdate([in]BSTRprinterName,[in]BSTRpaperName,[in]LONGwidth,[in]LONGheight,[out,retval]LONG*ret);24};25262728//CPaper2930[31coclass,32threading(apartment),33vi_progid(PrintCOM.Paper),34progid(PrintCOM.Paper.1),35version(1.0),36uuid(4C53CAB7-AD89-4A6A-8114-90E6A6554573),37helpstring(PaperClass)38]39classATL_NO_VTABLECPaper:40publicIPaper41{42public:43CPaper()44{45}464748DECLARE_PROTECT_FINAL_CONSTRUCT()4950HRESULTFinalConstruct()51{52returnS_OK;53}5455voidFinalRelease()56{5

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功