|
VB
中的打印一直是件比較頭痛的事情。通常大家會(huì)采用兩種方法實(shí)現(xiàn)打印功能,即使用
Printer
對(duì)象和別人制作的打印控件。
如果使用 Printer 對(duì)象需要自己去計(jì)算和控制打印位置,而在 VB中使用 Twip 作為長(zhǎng)度單位的計(jì)算量是非常大的。想想,一毫米就有 56.7 Twip,一頁(yè) A4 紙的寬度是 210 毫米,就有 56.7 × 210 = 11907 Twip,如此大的計(jì)算量,非把頭算暈不可。 如果使用控件,則有兩個(gè)問(wèn)題,一是網(wǎng)上的控件雖多,但往往沒(méi)有詳細(xì)的說(shuō)明文檔,使用的時(shí)候需要摸著石頭過(guò)河;二是網(wǎng)上的通用控件有時(shí)候不能滿足我們寫打印程序的一些特殊要求,如不能設(shè)計(jì)比較復(fù)雜的表格等。 使用 VB 編程的程序員都習(xí)慣把控件往窗體上拖,這也是 VB 易用之所在。于是我們就有一種想法:如果設(shè)計(jì)打印報(bào)表也能這么做該多好?這種想法真的不錯(cuò),而且也的確能夠?qū)崿F(xiàn),因?yàn)? VB 的 Form 對(duì)象提供了 PrintForm 方法。PrintForm 方法會(huì)使用默認(rèn)打印機(jī)打印當(dāng)前 Form 中的可視內(nèi)容,所以我們只需要設(shè)計(jì)一個(gè)合適的 Form,就可以非常容易地打印出理想的效果。 下面,我就以打印個(gè)人簡(jiǎn)歷為例,說(shuō)說(shuō)如何使用 Form 實(shí)現(xiàn)打印以及需要注意些什么問(wèn)題。 新建一個(gè) Standard EXE 工程,將工程名改為 MyPrintForm,默認(rèn)的 Form1 改名為 PrintForm。然后按下表修改其屬性:
其中,PrintForm 的大小是按 16 開紙的大小設(shè)置的。 然后,使用 Label、Shape 和 Line 控件在 PrintForm 中繪制出個(gè)人簡(jiǎn)歷表格。 個(gè)人簡(jiǎn)歷繪制完成后直接就可以打印,隨便在窗體中放一個(gè)按鈕 Command1,在其 Click 事件中寫兩行代碼即可: Me.Command1.Visible = False Me.PrintForm 然而,使用這種方法用于打印實(shí)在有些不正規(guī)。而且,那么大一個(gè) PrintForm 顯示在屏幕上,既不能滾動(dòng)也不能改變位置,實(shí)在有些難受——現(xiàn)在是該使用 MDIForm 的時(shí)候了。添加一個(gè)新的 MDIForm,命名為 MDIFormMain;將 PrintForm 的 MDIChild 屬性改為 True;這時(shí)候運(yùn)行程序,是不是非常漂亮的預(yù)覽效果?如果運(yùn)行的時(shí)候 PrintForm 沒(méi)有顯示出來(lái),請(qǐng)?jiān)O(shè)置 MDIFormMain 的 AutoShowChldren 屬性為 True。 現(xiàn)在我們只需要為 MDIFormMain 添加菜單或者按鈕以便選擇打印。添加菜單的方法相對(duì)比較簡(jiǎn)單,所以就添加一個(gè)菜單吧:名稱 MenuPrint,標(biāo)題為“打印(&P)”。不過(guò)菜單的代碼當(dāng)然不會(huì)還是 Me.PrintForm 了,應(yīng)該改為 Me.ActiveForm.PrintForm 至此,簡(jiǎn)單的打印功能已經(jīng)完成了。但是對(duì)于個(gè)人簡(jiǎn)歷表格,你是寧愿填好了再打印還是打印好了再填呢?用慣了計(jì)算機(jī)打印的人恐怕都不太喜歡動(dòng)筆,所以,如果能直接在 PrintForm 上填寫內(nèi)容,再將填好的表格打印出來(lái)就更好了。 要辦到這一點(diǎn)并不難,只需要在每個(gè)需要填寫內(nèi)容的地方放上一個(gè) TextBox 按控件即可,當(dāng)然,這個(gè)控件要設(shè)置一下:
然后記得清空它們的 Text 屬性,放適當(dāng)?shù)恼{(diào)整位置和大小。 再打印一次試試,結(jié)果并不如想象的那么好:TextBox 中的文本不是按矢量圖打印的,而是按位圖打印的,所以字體看起來(lái)非常不光滑。唯一的解決辦法就是在放置 TextBox 的地方,放置一個(gè)同樣大小同樣位置 Label 控件,并使之置于 TextBox 之下。然后修改打印菜單的 Click 事件: With Me.ActiveForm Label1.Caption = TextBox1.Text TextBox1.Visible = False …… .PrintForm. End With 從代碼可以看出來(lái),就是把每個(gè) TextBox 的 Text 值賦予對(duì)應(yīng)的 Label 的 Caption 屬性。然后再把這些 TextBox 隱藏掉??纯矗@次打印出來(lái)是不是非常令人滿意了! |
|
|
來(lái)自: ShangShujie > 《windows》