最新Delphi 精確打印Image畫布 以下是三零網(wǎng)為大家整理的最新Delphi 精確打印Image畫布的文章,希望大家能夠喜歡! 最近在做一個(gè)打印報(bào)告的小軟件,里面需要將Image上顯示的東西,按照“所見即所得”的原則打印出來。 好吧,最直接的方法當(dāng)然是把Image的畫布以圖片的形式輸出,這樣既不用考慮畫布上信息之間的相對(duì)位置,操作又簡(jiǎn)單。不過這樣操作有個(gè)硬傷:圖片失真。因?yàn)榇蛴C(jī)分辨率的關(guān)系,需要在打印時(shí)將畫布上的信息放大,才能匹配打印機(jī)的畫布,這樣難免會(huì)造成文字信息的拉伸變形。而且,使用圖片打印的話,需要傳輸?shù)酱蛴C(jī)的數(shù)據(jù)就會(huì)幾何倍增多,影響打印效率(這里還有一個(gè)問題,Delphi的Printer打印圖形時(shí),如果直接使用 canvas.stretchdraw 函數(shù)的話,在有的機(jī)器或者打印機(jī)上運(yùn)行時(shí)會(huì)出錯(cuò),很不穩(wěn)定。需要處理后才能正常打印,網(wǎng)上有一段直接打印位圖的代碼,可以參考下)??紤]到這些因素,在完成最初的版本之后,又重新選擇直接在打印機(jī)畫布上“作畫”的方式。 最初的原則不變,那么從效果上來說還是一樣,還是需要放大的過程。打開VCL,我們發(fā)現(xiàn) Printer單元封裝了大量的有關(guān)打印機(jī)操作的API函數(shù)(這句是廢話..), 我們?cè)谛枰@得打印機(jī)畫布信息時(shí),可以很方便的直接調(diào)用屬性。 首先,需要一個(gè)放大比例:
為了居中顯示,還需要長(zhǎng)寬各方向的偏差:
先來講一下線段、矩形框之類的圖形輸出,這一類比較簡(jiǎn)單,只要定位好坐標(biāo)就可以。 以線段為例:
遇到文字信息時(shí),首先,其坐標(biāo)設(shè)置與線段相同,不過在字體大小設(shè)置時(shí),為了像原畫布上那樣,與線段、矩形框這些元素保持相對(duì)位置不變,勢(shì)必不能使用原始大小。但是像線寬那樣Font.Size:= FontSize * lMultiple; 的話,打印出來的就是大字報(bào)了。那么該如何設(shè)置呢? 這里,我們需要迂回一下,先設(shè)置Printer.Canvas.Font.Height 屬性,方法是:
(如果涉及到多行打印,自動(dòng)換行問題,需要用到 DrawText 函數(shù),一些設(shè)置問題尚在測(cè)試中,完成了再拿出來與大家分享) 如此這般,就可以比較精確的實(shí)現(xiàn)單行文本輸出了,在Delphi6上測(cè)試通過。以上是筆者的一點(diǎn)愚見,如有不當(dāng)之處,還請(qǐng)不吝賜教,歡迎討論。 延伸閱讀: ·Delphi 打印TDBGrid 內(nèi)容代碼 ·Delphi檢測(cè)系統(tǒng)安裝的打印機(jī) ·Delphi調(diào)用ImageMagickObject進(jìn)行圖片轉(zhuǎn)換的代碼 ·Delphi通過Com+調(diào)用ImageMagick的范例代碼 ·delphi打印TImage圖片 ·Delphi在畫布上繪制文字輪廓 ·Delphi在畫布上繪制文本 |
|