Windows自定義列印的實現

2021-05-22 18:43:13 字數 3222 閱讀 6137

其實在windwos中呼叫windows api實現列印是比較簡單的,而且具有**緊湊、實現靈活的優點。我們只要掌握了幾個要點,就可以隨心所欲的列印了。下面我們將一一討論:

這個不多說了,相關的主要api只有乙個--printdlg(lpprintdlg lppd)--看例子**。

printdlg printinfo;

zeromemory(&printinfo,sizeof(printinfo));  //清空該結構

printinfo.lstructsize = sizeof(printinfo);  

printinfo.hwndowner = 0;  

printinfo.hdevmode = 0;

printinfo.hdevnames = 0;

//這個是關鍵,pd_returndc 如果不設這個標誌,就拿不到hdc了

//            pd_returndefault 這個就是得到預設印表機,不需要彈設定對話方塊

printinfo.flags = pd_returndc | pd_returndefault;  

//呼叫api拿出預設印表機

printdlg(&printinfo);

//看看出錯沒有

dword rst = commdlgextendederror();

if(rst != 0)

從上面的**,我們就知道彈不彈對話方塊的關鍵是設定printdlg結構的flags欄位。

要想在程式中定製我們的列印選項,devmode結構就是關鍵了。在這裡我們只舉例如何為列印設定自定義紙張。更詳細的設定資訊可以查詢msdn。

//首先得到devmode結構,同時申請系統鎖定,我們要修改它了

lpdevmode lpdevmode = (lpdevmode)::globallock(printinfo.hdevmode);

if(lpdevmode)  //成功得到該結構了

//記住要解鎖

globalunlock(printinfo.hdevmode);

//這個也不能忘了,否則更改不會生效

resetdc(printinfo.hdc, lpdevmode);這個的關鍵是我們要得到顯示裝置的dpi,即每英吋裝置支援的點數。有了dpi我們就可以在我們習慣的單位和裝置單位之間轉換了,用到的api是getdevicecaps(),這個函式功能強大,具體可參考msdn,在這裡我們只用來得到裝置dpi。看示例**:

//某些裝置水平和垂直方向的dpi可能不同,所以要分別得到。

//得到水平方向的轉換比例

float getxscale(hdc printdc)  //printdc: 印表機dc裝置控制代碼

//得到垂直方向的轉換比例

float getyscale(hdc printdc)  //printdc: 印表機dc裝置控制代碼

//厘公尺轉換為裝置畫素,水平方向

double cm2unit_w(float xscale, double w) //w單位為厘公尺

//厘公尺轉換為裝置畫素,垂直方向

double cm2unit_h(float yscale, double h) //h單位為厘公尺

上面**中,如果將printdc換為顯示器裝置dc控制代碼,即可得到厘公尺轉換為顯示器畫素單位,列印預覽時使用。得到顯示器裝置控制代碼可用::getdc(null)得到。

有了前面的知識,現在我們就可以列印了。windows列印是有著固定的流程的,流程也比較簡單。按照固定的順序呼叫列印api即可:startdoc() -> startpage() -> 列印具體內容 -> endpage() -> enddoc()。如果要列印多頁,迴圈startpage()至endpage()即可。

示例**:

docinfo   doc;   

zeromemory(&doc,sizeof(doc));  

doc.cbsize = sizeof(doc);  

doc.lpszdocname = (lpctstr)"print test file";

startdoc(printdc, &doc);  //準備列印

startpage(printdc);  //開始列印頁

//在(2.5cm, 2.5cm)處列印文字

char* text = "列印測試文字";

float xscale = getxscale(printdc);

float yscale = getyscale(printdc);

double x = cm2unit_w(xscale, 2.5);

double y = cm2unit_h(yscale, 2.5);

//在指定位置列印文字

textout(printdc, (int)x, (int)y, (lptstr)text, strlen(text));

endpage(printdc);  //結束列印頁

enddoc(printdc);  //結束列印

很多時候我們希望能控制列印字型,下面的**可以建立你想要的字型格式:

/*  建立自定義列印字型

fontface:字型名稱,如果為null,預設採用「宋體」

fontheight:字型高度,單位為厘公尺

isbold:是否加粗

isitalic:是否斜體

isunderline:是否下劃線

isstrikeout:是否刪除線

*/hfont getfont(lpctstr fontface, double fontheight, bool isbold, bool isitalic, bool isunderline, bool isstrikeout)

if(isbold)

if(isitalic)

if(isunderline)

if(isstrikeout)

hfont font = createfont((int)height, width, 0, 0,

weight, italic, underline, strikeout, charset,

out_default_precis, clip_default_precis, proof_quality,

default_pitch | ff_dontcare, face );

return font;

}

以上就是我們在實現列印中遇到的常見問題,相信理解了這些,在我們自己的程式中實現列印就不再是什麼困難的事情了。

自定義列印

1 第一種方法 page language c autoeventwireup true codefile testprint.aspx.cs inherits testprint 第二種方法 page language c autoeventwireup true codefile print.a...

自定義的列印函式

void userdefinedprintfun char format,int i,else if format 1 format d else if format 1 format f va end arg ptr return 如果採用下面三種方法呼叫,合法合理 userdefinedprin...

自定義Web列印內容

指定列印 if trim request.querystring id then set rs conn.execute select from news where newsid trim request.querystring id ssql select from news where new...