999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于.NET的自定義打印功能設(shè)計(jì)與實(shí)現(xiàn)

2009-04-29 00:00:00杜成龍
電腦知識(shí)與技術(shù) 2009年5期

摘要:打印功能是絕大部分軟件項(xiàng)目中必不可以少的功能,該文從原理的角度介紹了通用打印模塊的設(shè)計(jì)方法。如果讀者能熟練地掌握這一設(shè)計(jì)原理,相信很快就可以設(shè)計(jì)出自已所需要的報(bào)表,用其它開發(fā)語(yǔ)言工具,也可以很快設(shè)計(jì)出自已所需要的打印模塊。

關(guān)鍵詞:打印模塊;自定義;.NET

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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 引言

隨著軟件技術(shù)的發(fā)展,越來(lái)越多的新的或更先進(jìn)的開發(fā)工具出現(xiàn),軟件開發(fā)也越來(lái)越方便。但先進(jìn)的工具出現(xiàn)也使得很多開發(fā)者疲于學(xué)習(xí)更多新的東西。實(shí)際上,我們更贊同使用通用性較好的原理性的開發(fā)方法,只要熟練掌握并熟練實(shí)現(xiàn),就不至于因工具的變化而干擾我們的工作思路。

打印功能很長(zhǎng)時(shí)間都一直困繞著筆者,以至于筆者做軟件時(shí)總覺得不完美,要么是設(shè)計(jì)的功能不好用,要么就是設(shè)計(jì)得不合要求,總是感覺到欠缺什么,后來(lái)究其原因,原來(lái)這實(shí)際上是沒有真正掌握一種通用的好的設(shè)計(jì)方法所至,市面上又很少看到有關(guān)書籍介紹一種能快速地掌握自定義打印功能的方法。看到有些功能強(qiáng)大的打印設(shè)計(jì)軟件,真想自已能擁有一套,但第三方提供商又要收取昂貴的使用費(fèi),心里真的很煩躁,相信做過(guò)軟件的人都有這個(gè)感覺。筆者經(jīng)過(guò)一段時(shí)間的淺心學(xué)習(xí)和研究,終于掌握了自定義打印功能的設(shè)計(jì)與實(shí)現(xiàn)方法,在此與大家共享,相信很多有此需求的人會(huì)受益非淺。

下面以.NET平臺(tái)下C#語(yǔ)言為例,提出具體的設(shè)計(jì)方案,并以具體的實(shí)例說(shuō)明實(shí)現(xiàn)方法,相信大家一定能據(jù)此觸類旁通,很輕松地設(shè)計(jì)出自已所需要的自定義打印功能。

2 設(shè)計(jì)思路及分析

下面以庫(kù)存商品為例講解自定義打印向?qū)Ъ按蛴☆A(yù)覽的實(shí)現(xiàn),因自定義打印功能設(shè)計(jì)是通用的,所以如果要用在其它地方,只需改動(dòng)一下輸入條件即可使用。

設(shè)計(jì)效果及思路如下:

1) 點(diǎn)擊如圖1下的打印按鈕后顯示如圖2對(duì)話框,這是向?qū)?duì)話框的第一步。

2) 如圖2點(diǎn)擊下一步后,會(huì)顯示如圖3對(duì)話框,這是向?qū)?duì)話框的第二步。

3) 如圖3點(diǎn)擊下一步后,會(huì)顯示如圖4的對(duì)話框,這是向?qū)?duì)話框的第三步。

4) 如圖4 點(diǎn)擊上一步后,會(huì)顯示如圖3第二步的對(duì)話框,可以對(duì)前面設(shè)置的內(nèi)容進(jìn)行修改。

5) 如圖4點(diǎn)擊完成之后,會(huì)顯示如圖5打印預(yù)覽效果。

下面對(duì)以上操作的設(shè)計(jì)流程進(jìn)行一下分析和說(shuō)明:

首先是進(jìn)行打印前數(shù)據(jù)的輸入,由于本功能做成了通用模式,所以只需重新設(shè)置輸入條件即可,那么本模塊可以直接用在其它類似的打印模塊中。

其次是進(jìn)行打印前的標(biāo)題及數(shù)據(jù)顯示設(shè)置,當(dāng)設(shè)置好所有的條件及數(shù)據(jù)之后,就可以實(shí)現(xiàn)打印功能了。

最后是實(shí)現(xiàn)打印功能,只要掌握如何編寫在指定的位置繪制表格和文字的方法,即可很容易實(shí)現(xiàn)打印功能了。

3 關(guān)鍵技術(shù)設(shè)計(jì)與實(shí)現(xiàn)

要完整實(shí)現(xiàn)自定義打印功能,根據(jù)上面的設(shè)計(jì)主要包括數(shù)據(jù)輸入部分、顯示設(shè)置部分和打印預(yù)覽部分。下面按實(shí)現(xiàn)方案分別討論關(guān)鍵技術(shù)。

3.1 建立數(shù)據(jù)輸入程序

1) 首先在設(shè)計(jì)之前要定義一個(gè)專門用于存儲(chǔ)向?qū)гO(shè)置時(shí)的打印設(shè)置類,定義cReportInfo.cs文件,參考代碼如下:

class cReportInfo{

public static string PrimaryTitle;//主標(biāo)題

public static string SecondaryTitle;//副標(biāo)題

public static string StartDate;//起始時(shí)間

public static string EndDate;//結(jié)束時(shí)間

public static string Comments;//附注

public static string Author;//制表人

public static string Date;//制表日期

public static ArrayList ReportColumns = new ArrayList();//所有的供選擇的列名稱

public static ArrayList ReportSelectColumns=new ArrayList();//已選擇的列名稱

//對(duì)標(biāo)題進(jìn)行初始化

public static void ClearTitle(){……}

//清空列名稱

public static void ClearColumns(){……}

}

2) 下面是定義打印前的數(shù)據(jù)輸入設(shè)置方法,如果用在其它地方,只需在此修改輸入數(shù)據(jù)即可,當(dāng)點(diǎn)擊打印按鈕后,就會(huì)進(jìn)入向?qū)н^(guò)程,設(shè)計(jì)算法描述如下:

private void tlBtnPrint_Click(object sender, EventArgs e)

{ 清空打印設(shè)置類;

從數(shù)據(jù)顯示控件獲取所有供選擇的列名稱;

將數(shù)據(jù)顯示控件作參數(shù)傳給向?qū)Т绑w(1);

將向?qū)Т绑w(1)顯示出來(lái);

}

3) 向?qū)Т绑w(1)主要是為了顯示一些提示信息及準(zhǔn)備一些必需的數(shù)據(jù),顯示時(shí)需要進(jìn)行一些初始化,即要傳入需要的參數(shù)。當(dāng)在向?qū)Т绑w(1)中,點(diǎn)擊下一步按鈕時(shí),要打開向?qū)Т绑w(2),并傳入需要的參數(shù),算法描述如下:

private void BtnNext_Click(object sender, EventArgs e){ 定義向?qū)Т绑w(2)對(duì)象并傳入?yún)?shù);

顯示向?qū)Т绑w(2);}

數(shù)據(jù)輸入程序的功能主要是獲取即將顯示的數(shù)據(jù)源問(wèn)題,但這只是完成了第一步,下面是完成打印的設(shè)置問(wèn)題。

3.2 建立顯示設(shè)置程序

建立顯示設(shè)置程序主要是為了確定打印顯示的內(nèi)容,此處實(shí)際上是設(shè)置cReportInfo類型的對(duì)象中的所有數(shù)據(jù)成員。

由于在每一步向?qū)Т翱陲@示本窗體時(shí)要將前階段有效的數(shù)據(jù)傳入,故要重載構(gòu)造函數(shù)用于設(shè)置傳入的參數(shù)。同時(shí)為了保存前階段傳入的數(shù)據(jù)設(shè)置,需要實(shí)現(xiàn)Load方法;

打印向?qū)?2)和打印向?qū)?3)窗體是顯示設(shè)置的主要窗口,操作方便是這兩個(gè)窗口要解決的首要任務(wù),此界面功能設(shè)計(jì)很簡(jiǎn)單,在此不再闡述。

3.3 建立打印預(yù)覽程序

建立打印預(yù)覽程序是本功能模塊的核心,實(shí)現(xiàn)打印功能最主要是掌握打印過(guò)程實(shí)現(xiàn)的原理及繪圖方法。

當(dāng)打印文檔對(duì)象PrintDocument被調(diào)用時(shí),會(huì)激活PrintPage事件,在此方法中就可以實(shí)現(xiàn)繪制報(bào)表的任務(wù)。算法描述如下:

private void pd_PrintPage(object sender,

System.Drawing.Printing.PrintPageEventArgs e)

{初始化變量;

try{

繪制機(jī)密;

繪制標(biāo)題;

繪制副標(biāo)題;

//繪制矩形表格及數(shù)據(jù)

//1.繪制列名稱;

for (int col = 0; col < 所選擇的列數(shù);col++ )

{ 畫列標(biāo)題;}

yPos += 50;

//2.繪制多行數(shù)據(jù)

while (rowindex < 行數(shù)-1)

{獲取整行最大的行高;

for (int col = 0; col <所選擇的列數(shù);col++)

{ 繪制該行每個(gè)單元格的數(shù)據(jù); }

yPos += rowHeight;

rowindex++;

if(當(dāng)前高度大于底邊界值)

{e.HasMorePages = true;//分頁(yè)打印

return;

}

}

繪制附注;

繪制制表人;

繪制制表日期;

e.HasMorePages = 1;//結(jié)束打印

}catch (System.Exception ex)

{錯(cuò)誤提示;}

}

繪制思路確定下來(lái)后,下面主要是掌握繪制單元格的方法。不管是文字部分還是矩形框部分,統(tǒng)一繪制矩形框,然后中間填寫文字內(nèi)容。如果只寫文字畫空邊即可,如果只畫矩形框?qū)懣瘴淖旨纯伞N覀儼颜麄€(gè)頁(yè)面分割成了一個(gè)個(gè)小單元格之后,就可以任意的根據(jù)需要畫矩形框了。下面自定義繪單元格的參考代碼如下:

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);(下轉(zhuǎn)第1099頁(yè))

(上接第1095頁(yè))

}catch(Exception ex){錯(cuò)誤提示; }

}

此處定義的繪單元格的方法基本可以通用,只需傳入合適的參數(shù)就可以繪出所需要的單元格。如果想要畫出更復(fù)雜的單元格,在此基礎(chǔ)上添加內(nèi)容即可。

4 結(jié)束語(yǔ)

打印功能是絕大部分軟件項(xiàng)目中必不可以少的功能,但是市面上絕大部分相關(guān)資料上都很少有設(shè)計(jì)通用性較強(qiáng)的打印模塊的介紹,如果讀者能熟練地掌握這一設(shè)計(jì)原理,相信很快就可以設(shè)計(jì)出其它的報(bào)表,即使用其它開發(fā)工具,也可以很快設(shè)計(jì)出自已所需要的打印模塊。

參考文獻(xiàn):

[1] 張躍廷.C#數(shù)據(jù)庫(kù)系統(tǒng)開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2006.

[2] 李繼武.VisualC#.NET項(xiàng)目開發(fā)實(shí)戰(zhàn)[M].北京:清華大學(xué)出版社,2007.

主站蜘蛛池模板: 亚洲经典在线中文字幕| 激情五月婷婷综合网| 高清无码手机在线观看| 国产成人综合亚洲网址| 国内熟女少妇一线天| 无码免费视频| 午夜欧美理论2019理论| 精品少妇人妻av无码久久| 免费国产不卡午夜福在线观看| 亚洲最新地址| 国产草草影院18成年视频| 国产美女91视频| 国产男人天堂| 免费无遮挡AV| 国产午夜精品鲁丝片| 国产精品免费入口视频| 成年人午夜免费视频| a级毛片毛片免费观看久潮| 少妇精品久久久一区二区三区| 一本综合久久| 亚洲欧洲日韩综合| 熟女视频91| 日本亚洲成高清一区二区三区| 一级毛片视频免费| 欧美成人看片一区二区三区 | 亚洲欧美日韩色图| 欧美成人区| 91久久偷偷做嫩草影院电| 久久精品国产电影| 日韩A∨精品日韩精品无码| 2021国产乱人伦在线播放| 亚洲视频黄| 婷婷六月激情综合一区| 色丁丁毛片在线观看| 天天色综网| 国产迷奸在线看| 亚洲成人黄色在线| 成人精品在线观看| 美女高潮全身流白浆福利区| 黄色片中文字幕| 欧美笫一页| 青青青视频蜜桃一区二区| 国产视频a| 在线看片中文字幕| 伊伊人成亚洲综合人网7777| 日本在线视频免费| 一本综合久久| 亚洲AV无码不卡无码| 国产 日韩 欧美 第二页| 久久综合九色综合97婷婷| 伊人色在线视频| Aⅴ无码专区在线观看| 日本AⅤ精品一区二区三区日| 亚洲 欧美 偷自乱 图片| 欧美精品综合视频一区二区| 青青青伊人色综合久久| 久久这里只有精品8| 国产91导航| 粉嫩国产白浆在线观看| 久久99久久无码毛片一区二区| 国产无码性爱一区二区三区| 亚洲无码熟妇人妻AV在线| 国产午夜人做人免费视频| 成人毛片免费观看| 亚洲欧美一区二区三区蜜芽| 人与鲁专区| 亚洲一级无毛片无码在线免费视频 | 日韩不卡高清视频| 高清不卡一区二区三区香蕉| 久久这里只有精品23| 黄色不卡视频| 免费在线成人网| 激情综合婷婷丁香五月尤物| 欧美一区二区三区国产精品| 国产靠逼视频| 欧美色综合网站| 亚洲国产精品一区二区第一页免| 九色在线视频导航91| 乱码国产乱码精品精在线播放| 欧美日本中文| 毛片免费视频| 国产无人区一区二区三区|