C#程序中動態(tài)增加更新自定義紙型的方法_第1頁
C#程序中動態(tài)增加更新自定義紙型的方法_第2頁
C#程序中動態(tài)增加更新自定義紙型的方法_第3頁
C#程序中動態(tài)增加更新自定義紙型的方法_第4頁
C#程序中動態(tài)增加更新自定義紙型的方法_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、窗體頂端解決在C#程序中動態(tài)增加/更新自定義紙型的方法 解決打印時,程序中動態(tài)添加紙型的問題是C#中常見的難題,為了防止大家也走我一樣的彎路,特將我的解決過程分享出來。 在寫過大量C#代碼后,大家都有一種同感,C#類庫功能極其強(qiáng)大,但總有局部缺乏。在前不久,為了滿足眾多客戶對打印格式和紙型要求并不完全一致的需求,花了N個夜晚做了個的自定義套打的工具集,主要功能包括:定制數(shù)據(jù)源(由朋友完成),根據(jù)數(shù)據(jù)源定制打印模板,根據(jù)打印模板和數(shù)據(jù)源參數(shù)進(jìn)行打印。 當(dāng)然這里的重點(diǎn)不是說明該程序的功能。這里是說明如何在C#中更有效的方法增加自定義紙型。 剛開始我所想到的方法應(yīng)當(dāng)是大家都能想到的方法:就是使用Dl

2、lImport. 經(jīng)過屢次尋找,我找到了一個專門提供系統(tǒng)API在VB/VB.net/C#中使用的 在這里提供了AddForm,DeleteForm等打印專用的API的DllImport方法, 同時參考在微軟網(wǎng)站上的打印紙型增加的方法:如何在 Windows NT 和 Windows 2000 中使用自定義頁面大小打印 文章內(nèi)代碼全是VB寫的,無法在C#中直接使用,怎么辦呢?改造成C#吧。 接下來就是改造過程,有一大堆的結(jié)構(gòu)體要轉(zhuǎn)換,還有一大堆的API要定義??喟?,也罷問題能解決不就得了。 等等。這里有這么兩段: Call CopyMemory(aFI1(0), Temp(0), BytesNe

3、eded) Call CopyMemory(aDevMode(1), pDevMode, Len(pDevMode) 暈,如何轉(zhuǎn)CopyMemory呢?在C+中使用指針對我來說,并沒有什么困難,但在C#中,想使用指針還真費(fèi)手腳。繼續(xù)還是放棄? 暫時放棄吧,原因是VB也可以寫COM的。而COM在C#中使用比擬簡單,說干就干,開始使用MS的代碼用VB寫ATL控件,忙了半天,終于出來了,呵呵,主要是刪截代碼。在C#中成功引用,并寫出使用的代碼,結(jié)果提示說類型不匹配?什么地方類型不匹配呢?無法跟蹤,痛苦。再次放棄。 重新回到C#的DllImport上,研究IntPtr等,結(jié)果還是有種很難受的感覺。怎么

4、辦呢?郁悶了兩天,那兩天可是周末的兩天啊。 經(jīng)過兩天痛苦之后,周一時重新理了下思路,還是從COM的路。不過換方向,使用VC+吧。 先定義了三個方法: Add,Remove,Update,對我來說這三個方法已經(jīng)足夠了 Add用于增加紙型,Remove用于刪除紙型,Update當(dāng)然是更新紙型大小了。 用C+寫起來就是爽啊。很快幾個方法就寫好了。 放在C#代碼中一試,增加紙型成功。在打印機(jī)的紙型列表中一看,沒有?真是奇怪了。這是怎么回事呢?查詢MSDN中關(guān)于FORM_INFO_1的說明, pName Pointer to a null-terminated string that specifies

5、 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英寸為單位的,因?yàn)镃#類中說明PageSize的大小是以1/100吋為單位的。這里盡然是1/1000毫米,真是氣壞我了。到此,問題全部解決,紙型定義成功。 局部代碼

6、: 1/Paper.cpp:CPaper的實(shí)現(xiàn)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,LON

7、G*ret)2021char*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)2829ClosePrinter(pPrinter);3

8、0*ret=FALSE;31gotoEND_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);45

9、ClosePrinter(pPrinter);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,(LPBYT

10、E)&aFI10,0,&dwNeeded,&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;

11、73break;747576delete(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=Open

12、Printer(strPrinterName,&pPrinter,NULL);88if(*ret=FALSE|pPrinter=NULL)8990gotoEND_REMOVE;9192if(GetIndex(pPrinter,strPaperName)=-1)9394ClosePrinter(pPrinter);95*ret=TRUE;96gotoEND_REMOVE;979899*ret=DeleteForm(pPrinter,strPaperName);100ClosePrinter(pPrinter);101END_REMOVE:102if(*ret=FALSE)returnS_FALS

13、E;103returnS_OK;104105106STDMETHODIMPCPaper:Update(BSTRprinterName,BSTRpaperName,LONGwidth,LONGheight,LONG*ret)107108/TODO:在此添加實(shí)現(xiàn)代碼109Remove(printerName,paperName,ret);110if(*ret=FALSE)returnS_FALSE;111Add(printerName,paperName,width,height,ret);112if(*ret=FALSE)returnS_FALSE;113returnS_OK;114115116

14、1171/Paper.h:CPaper的聲明23#pragmaonce4#includeresource.h/主符號5#includeWinuser.h67namespaceCNetware89101112/IPaper1314object,15uuid(4BCEEB5C-F384-4424-B961-FB7B1214D871),16dual,helpstring(IPaper接口),17pointer_default(unique)1819_interfaceIPaper:IDispatch2021id(1),helpstring(方法AddPaper)HRESULTAdd(inBSTRpr

15、interName,inBSTRpaperName,inLONGwidth,inLONGheight,out,retvalLONG*ret);22id(2),helpstring(方法Remove)HRESULTRemove(inBSTRprinterName,inBSTRpaperName,out,retvalLONG*ret);23id(3),helpstring(方法Update)HRESULTUpdate(inBSTRprinterName,inBSTRpaperName,inLONGwidth,inLONGheight,out,retvalLONG*ret);24;25262728/

16、CPaper293031coclass,32threading(apartment),33vi_progid(PrintCOM.Paper),34progid(PrintCOM.Paper.1),35version(1.0),36uuid(4C53CAB7-AD89-4A6A-8114-90E6A6554573),37helpstring(PaperClass)3839classATL_NO_VTABLECPaper:40publicIPaper4142public:43CPaper()4445464748DECLARE_PROTECT_FINAL_CONSTRUCT()4950HRESULT

17、FinalConstruct()5152returnS_OK;535455voidFinalRelease()56575859public:6061STDMETHOD(Add)(INBSTRprinterName,INBSTRpaperName,INLONGwidth,INLONGheight,OUTLONG*ret);62STDMETHOD(Remove)(INBSTRprinterName,INBSTRpaperName,OUTLONG*ret);63STDMETHOD(Update)(INBSTRprinterName,INBSTRpaperName,INLONGwidth,INLONG

18、height,OUTLONG*ret);6465private:66/查詢紙型的索引號67intGetIndex(HANDLEhPrinter,LPSTRpaperName);68;6970;71 1usingSystem;2usingSystem.Drawing.Printing;3usingSystem.Windows.Forms;45namespaceCNetware.Print.Design67/*/8/PaperForm的摘要說明。9/10publicclassPaperForm1112privatestaticPrintCOM.CPaperClasscp=newPrintCOM.C

19、PaperClass();1314privatePaperForm()1516/17/TODO:在此處添加構(gòu)造函數(shù)邏輯18/1920/如果存在那么更新,不存在那么增加21/*/22/向指定的打印機(jī)增加紙型23/24/打印機(jī)名稱25/紙型名稱26/單位1/1000毫米27/單位1/1000毫米28/檢查紙型是否存在于當(dāng)前紙型集合中。29publicstaticboolAdd(stringprinterName,stringformName,intwidth,intheight,PrinterSettings.PaperSizeCollectionpaperSizes)3031foreach(PaperSizepsinpaperSizes)3233if(ps.PaperName=formName)3435thrownewException(formName+已經(jīng)存在,請使用Update更新。);363738if(cp.Add(null,formName,width,height)=1)3940returntrue;4142else4344returnfalse;45464748/*/49/移除紙型。50/51/打印機(jī)名稱52/紙型名稱53/檢查紙型是否存在于當(dāng)前紙型集合中。54publicstaticboolRemove(stringprinterN

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論