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

上传人:xins****2008 文档编号:100859131 上传时间:2019-09-25 格式:DOC 页数:13 大小:366KB
返回 下载 相关 举报
c 程序中动态增加更新自定义纸型的方法_第1页
第1页 / 共13页
c 程序中动态增加更新自定义纸型的方法_第2页
第2页 / 共13页
c 程序中动态增加更新自定义纸型的方法_第3页
第3页 / 共13页
c 程序中动态增加更新自定义纸型的方法_第4页
第4页 / 共13页
c 程序中动态增加更新自定义纸型的方法_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《c 程序中动态增加更新自定义纸型的方法》由会员分享,可在线阅读,更多相关《c 程序中动态增加更新自定义纸型的方法(13页珍藏版)》请在金锄头文库上搜索。

1、窗体顶端解决在C#程序中动态增加/更新自定义纸型的方法 解决打印时,程序中动态添加纸型的问题是C#中常见的难题,为了避免大家也走我一样的弯路,特将我的解决过程分享出来。 在写过大量C#代码后,大家都有一种同感,C#类库功能极其强大,但总有部分不足。在前不久,为了满足众多客户对打印格式和纸型要求并不完全一致的需求,花了N个夜晚做了个的自定义套打的工具集,主要功能包括:定制数据源(由朋友http:/ 当然这里的重点不是说明该程序的功能。这里是说明如何在C#中更有效的方法增加自定义纸型。 刚开始我所想到的方法应当是大家都能想到的方法:就是使用DllImport. 经过多次寻找,我找到了一个专门提供系

2、统API在VB/VB.net/C#中使用的网址: http:/ 在这里提供了AddForm,DeleteForm等打印专用的API的DllImport方法, 同时参考在微软网站上的打印纸型增加的方法:如何在 Windows NT 和 Windows 2000 中使用自定义页面大小打印 文章内代码全是VB写的,无法在C#中直接使用,怎么办呢?改造成C#吧。 接下来就是改造过程,有一大堆的结构体要转换,还有一大堆的API要定义。苦啊,也罢问题能解决不就得了。 等等。这里有这么两段: Call CopyMemory(aFI1(0), Temp(0), BytesNeeded) Call CopyMe

3、mory(aDevMode(1), pDevMode, Len(pDevMode) 晕,如何转CopyMemory呢?在C+中使用指针对我来说,并没有什么困难,但在C#中,想使用指针还真费手脚。继续还是放弃? 暂时放弃吧,原因是VB也可以写COM的。而COM在C#中使用比较简单,说干就干,开始使用MS的代码用VB写ATL控件,忙了半天,终于出来了,呵呵,主要是删截代码。在C#中成功引用,并写出使用的代码,结果提示说类型不匹配?什么地方类型不匹配呢?无法跟踪,痛苦。再次放弃。 重新回到C#的DllImport上,研究IntPtr等,结果还是有种很难受的感觉。怎么办呢?郁闷了两天,那两天可是周末的

4、两天啊。 经过两天痛苦之后,周一时重新理了下思路,还是从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

5、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:CPa

6、per的实现23#includestdafx.h4#includePaper.h5#include.paper.h6#include7#include8#include9#pragmacomment(lib,comsupp.lib)1011#ifndefCNW_DEBUG12#defineCNW_DEBUG13#endif1415/CPaper16namespaceCNetware171819STDMETHODIMPCPaper:Add(INBSTRprinterName,INBSTRpaperName,INLONGwidth,INLONGheight,LONG*ret)2021char*st

7、rPrinterName=_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)2829ClosePrinter(pPrinter);30*ret=FALSE;31got

8、oEND_ADD;323334FORM_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(pPri

9、nter);4647END_ADD:48if(*ret=FALSE)returnS_FALSE;49returnS_OK;5051intCPaper:GetIndex(HANDLEhPrinter,LPSTRpaperName)5253DWORDdwNeeded,dwReturned;54FORM_INFO_1*aFI1;55BOOLbret;56BYTE*TEMP;57intindex=-1;5859aFI1=(FORM_INFO_1*)newBYTEsizeof(FORM_INFO_1);60bret=EnumForms(hPrinter,1,(LPBYTE)&aFI10,0,&dwNee

10、ded,&dwReturned);61delete(BYTE*)aFI1;62TEMP=newBYTEdwNeeded;63aFI1=(FORM_INFO_1*)newBYTEdwNeeded;64bret=EnumForms(hPrinter,1,TEMP,dwNeeded,&dwNeeded,&dwReturned);6566CopyMemory(aFI1,TEMP,dwNeeded);6768for(inti=0;i(int)dwReturned;i+)6970if(strcmp(aFI1i.pName,paperName)=0)7172index=i;73break;747576del

11、ete(BYTE*)TEMP;77delete(BYTE*)aFI1;7879returnindex;8081STDMETHODIMPCPaper:Remove(BSTRprinterName,BSTRpaperName,LONG*ret)8283HANDLEpPrinter=NULL;8485char*strPrinterName=_com_util:ConvertBSTRToString(printerName);86char*strPaperName=_com_util:ConvertBSTRToString(paperName);87*ret=OpenPrinter(strPrinterName,&pPrinter,NULL);88if(*ret=FALSE|pPrinter=NULL)8990gotoEND_REMOVE;9192if(GetIndex(pPrinter,strPaperName)=-1)9394ClosePrinter(pPrinter);95*ret=TRUE;96gotoEND_REMOVE;979899*ret=De

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号