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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、eded) Call CopyMemory(aDevMode(1), pDevMode, Len(pDevMode) 暈,如何轉CopyMemory呢?在C+中使用指針對我來說,并沒有什么困難,但在C#中,想使用指針還真費手腳。繼續(xù)還是放棄? 暫時放棄吧,原因是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

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

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

溫馨提示

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

評論

0/150

提交評論