摘要:打印功能是絕大部分軟件項目中必不可以少的功能,該文從原理的角度介紹了通用打印模塊的設計方法。如果讀者能熟練地掌握這一設計原理,相信很快就可以設計出自已所需要的報表,用其它開發語言工具,也可以很快設計出自已所需要的打印模塊。
關鍵詞:打印模塊;自定義;.NET
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2009)05-1093-03
Design and Implementation of Custom Printing Function Based on .NET
DU Cheng-long
(Hubei Professional College of Land Resource, Jingzhou 434002, China)
Abstract: Printing function is the vast majority of software projects will not be less functionality, this article from the principle point of view introduced the general printing module design. If the skilled reader can grasp the principles of design, will soon be able to have been designed from the required statements, with the development of other language tools, you can quickly design the printing module required.
Key words: printing function; custom; .NET
1 引言
隨著軟件技術的發展,越來越多的新的或更先進的開發工具出現,軟件開發也越來越方便。但先進的工具出現也使得很多開發者疲于學習更多新的東西。實際上,我們更贊同使用通用性較好的原理性的開發方法,只要熟練掌握并熟練實現,就不至于因工具的變化而干擾我們的工作思路。
打印功能很長時間都一直困繞著筆者,以至于筆者做軟件時總覺得不完美,要么是設計的功能不好用,要么就是設計得不合要求,總是感覺到欠缺什么,后來究其原因,原來這實際上是沒有真正掌握一種通用的好的設計方法所至,市面上又很少看到有關書籍介紹一種能快速地掌握自定義打印功能的方法。看到有些功能強大的打印設計軟件,真想自已能擁有一套,但第三方提供商又要收取昂貴的使用費,心里真的很煩躁,相信做過軟件的人都有這個感覺。筆者經過一段時間的淺心學習和研究,終于掌握了自定義打印功能的設計與實現方法,在此與大家共享,相信很多有此需求的人會受益非淺。
下面以.NET平臺下C#語言為例,提出具體的設計方案,并以具體的實例說明實現方法,相信大家一定能據此觸類旁通,很輕松地設計出自已所需要的自定義打印功能。
2 設計思路及分析
下面以庫存商品為例講解自定義打印向導及打印預覽的實現,因自定義打印功能設計是通用的,所以如果要用在其它地方,只需改動一下輸入條件即可使用。
設計效果及思路如下:
1) 點擊如圖1下的打印按鈕后顯示如圖2對話框,這是向導對話框的第一步。
2) 如圖2點擊下一步后,會顯示如圖3對話框,這是向導對話框的第二步。
3) 如圖3點擊下一步后,會顯示如圖4的對話框,這是向導對話框的第三步。
4) 如圖4 點擊上一步后,會顯示如圖3第二步的對話框,可以對前面設置的內容進行修改。
5) 如圖4點擊完成之后,會顯示如圖5打印預覽效果。
下面對以上操作的設計流程進行一下分析和說明:
首先是進行打印前數據的輸入,由于本功能做成了通用模式,所以只需重新設置輸入條件即可,那么本模塊可以直接用在其它類似的打印模塊中。
其次是進行打印前的標題及數據顯示設置,當設置好所有的條件及數據之后,就可以實現打印功能了。
最后是實現打印功能,只要掌握如何編寫在指定的位置繪制表格和文字的方法,即可很容易實現打印功能了。
3 關鍵技術設計與實現
要完整實現自定義打印功能,根據上面的設計主要包括數據輸入部分、顯示設置部分和打印預覽部分。下面按實現方案分別討論關鍵技術。
3.1 建立數據輸入程序
1) 首先在設計之前要定義一個專門用于存儲向導設置時的打印設置類,定義cReportInfo.cs文件,參考代碼如下:
class cReportInfo{
public static string PrimaryTitle;//主標題
public static string SecondaryTitle;//副標題
public static string StartDate;//起始時間
public static string EndDate;//結束時間
public static string Comments;//附注
public static string Author;//制表人
public static string Date;//制表日期
public static ArrayList ReportColumns = new ArrayList();//所有的供選擇的列名稱
public static ArrayList ReportSelectColumns=new ArrayList();//已選擇的列名稱
//對標題進行初始化
public static void ClearTitle(){……}
//清空列名稱
public static void ClearColumns(){……}
}
2) 下面是定義打印前的數據輸入設置方法,如果用在其它地方,只需在此修改輸入數據即可,當點擊打印按鈕后,就會進入向導過程,設計算法描述如下:
private void tlBtnPrint_Click(object sender, EventArgs e)
{ 清空打印設置類;
從數據顯示控件獲取所有供選擇的列名稱;
將數據顯示控件作參數傳給向導窗體(1);
將向導窗體(1)顯示出來;
}
3) 向導窗體(1)主要是為了顯示一些提示信息及準備一些必需的數據,顯示時需要進行一些初始化,即要傳入需要的參數。當在向導窗體(1)中,點擊下一步按鈕時,要打開向導窗體(2),并傳入需要的參數,算法描述如下:
private void BtnNext_Click(object sender, EventArgs e){ 定義向導窗體(2)對象并傳入參數;
顯示向導窗體(2);}
數據輸入程序的功能主要是獲取即將顯示的數據源問題,但這只是完成了第一步,下面是完成打印的設置問題。
3.2 建立顯示設置程序
建立顯示設置程序主要是為了確定打印顯示的內容,此處實際上是設置cReportInfo類型的對象中的所有數據成員。
由于在每一步向導窗口顯示本窗體時要將前階段有效的數據傳入,故要重載構造函數用于設置傳入的參數。同時為了保存前階段傳入的數據設置,需要實現Load方法;
打印向導(2)和打印向導(3)窗體是顯示設置的主要窗口,操作方便是這兩個窗口要解決的首要任務,此界面功能設計很簡單,在此不再闡述。
3.3 建立打印預覽程序
建立打印預覽程序是本功能模塊的核心,實現打印功能最主要是掌握打印過程實現的原理及繪圖方法。
當打印文檔對象PrintDocument被調用時,會激活PrintPage事件,在此方法中就可以實現繪制報表的任務。算法描述如下:
private void pd_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{初始化變量;
try{
繪制機密;
繪制標題;
繪制副標題;
//繪制矩形表格及數據
//1.繪制列名稱;
for (int col = 0; col < 所選擇的列數;col++ )
{ 畫列標題;}
yPos += 50;
//2.繪制多行數據
while (rowindex < 行數-1)
{獲取整行最大的行高;
for (int col = 0; col <所選擇的列數;col++)
{ 繪制該行每個單元格的數據; }
yPos += rowHeight;
rowindex++;
if(當前高度大于底邊界值)
{e.HasMorePages = true;//分頁打印
return;
}
}
繪制附注;
繪制制表人;
繪制制表日期;
e.HasMorePages = 1;//結束打印
}catch (System.Exception ex)
{錯誤提示;}
}
繪制思路確定下來后,下面主要是掌握繪制單元格的方法。不管是文字部分還是矩形框部分,統一繪制矩形框,然后中間填寫文字內容。如果只寫文字畫空邊即可,如果只畫矩形框寫空文字即可。我們把整個頁面分割成了一個個小單元格之后,就可以任意的根據需要畫矩形框了。下面自定義繪單元格的參考代碼如下:
private void DrawCell(Graphics g,Rectangle r,string s,string fontName,int fontSize,StringAlignment hAlign,StringAlignment vAlign,bool bold)
{ try
{Pen p=new Pen(Brushes.Gray);
g.DrawRectangle(p,r);
Font oldFont=new Font(fontName,fontSize);
Font newFont=new Font(oldFont,bold?oldFont.Style|FontStyle.Bold:oldFont.Style);
StringFormat sf=new StringFormat();
sf.Alignment=hAlign;
sf.LineAlignment=vAlign;
g.DrawString(s,newFont,Brushes.Black,r,sf);(下轉第1099頁)
(上接第1095頁)
}catch(Exception ex){錯誤提示; }
}
此處定義的繪單元格的方法基本可以通用,只需傳入合適的參數就可以繪出所需要的單元格。如果想要畫出更復雜的單元格,在此基礎上添加內容即可。
4 結束語
打印功能是絕大部分軟件項目中必不可以少的功能,但是市面上絕大部分相關資料上都很少有設計通用性較強的打印模塊的介紹,如果讀者能熟練地掌握這一設計原理,相信很快就可以設計出其它的報表,即使用其它開發工具,也可以很快設計出自已所需要的打印模塊。
參考文獻:
[1] 張躍廷.C#數據庫系統開發完全手冊[M].北京:人民郵電出版社,2006.
[2] 李繼武.VisualC#.NET項目開發實戰[M].北京:清華大學出版社,2007.