其實在windwos中呼叫windows api實現列印是比較簡單的,而且具有**緊湊、實現靈活的優點。我們只要掌握了幾個要點,就可以隨心所欲的列印了。下面我們將一一討論:
這個不多說了,相關的主要api只有乙個--printdlg(lpprintdlg lppd)--看例子**。
printdlg printinfo;從上面的**,我們就知道彈不彈對話方塊的關鍵是設定printdlg結構的flags欄位。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)
要想在程式中定製我們的列印選項,devmode結構就是關鍵了。在這裡我們只舉例如何為列印設定自定義紙張。更詳細的設定資訊可以查詢msdn。
//首先得到devmode結構,同時申請系統鎖定,我們要修改它了上面**中,如果將printdc換為顯示器裝置dc控制代碼,即可得到厘公尺轉換為顯示器畫素單位,列印預覽時使用。得到顯示器裝置控制代碼可用::getdc(null)得到。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單位為厘公尺
有了前面的知識,現在我們就可以列印了。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...