vc中的列印
本文對這種現象的原因和mfc的列印機制進行了深入的分析,並提出了一種特別簡單的方法,在原有的程式中只需加入幾行**就能解決這一問題,實現所見即所得的列印。
首先,分析mfc的列印機制,把原理弄清楚了,就不難明白現象形成的原因和提出解決辦法。mfc應用程式的核心是文件物件以及相關的檢視視窗的概念,即cdocument類和cview類的構成和關係,簡單地說cdocument類負責資料的生成和儲存,cview類負責資料的顯示和使用者互動。輸出到螢幕和輸出到印表機都是資料的顯示,實質上是一樣的,所以列印功能也是由cview類來實現的。
在cview類中由應用程式嚮導自動生成的源**提供了乙個ondraw(cdc* pdc)的函式,通過過載這個函式,利用它提供的pdc(裝置上下文)指標,可以在螢幕上顯示各種圖形和資料。cview類的列印是通過onprint(cdc* pdc, cprintinfo* pinfo)這個函式實現的,應用程式嚮導自動生成的源**中沒有這個函式的框架,而這個函式對列印的實現就是簡單地呼叫ondraw(cdc* pdc)這個函式,把印表機的裝置上下文指標pdc傳遞給ondraw(cdc* pdc)函式。
可見cview類對輸出到螢幕和輸出到印表機的處理都是一樣的,只是換了乙個裝置上下文而已,那麼為什麼輸出到印表機的影象特別小呢?
這與vc採用的預設的座標對映方式mm_text有關,這種方式的好處是使用者圖形座標和裝置的象素完全一致。但是在螢幕的象素大小為800*600時,每邏輯英吋包含的螢幕象素為96,而印表機的點數卻要多好幾倍,如當印表機為hp laserjet 6l時每邏輯英吋包含的印表機點數為600,也就是說印表機的清晰度比螢幕要高得多。
這樣的後果就是在螢幕上顯示出來的滿屏影象在列印出來的紙上卻只有一點點大,怎麼解決這個問題呢?一種簡單的方法就是轉換座標對映方式,使得列印時採用的座標比例比顯示時採用的座標比例相應地大若干倍,就可以解決這一問題。
下面將給出詳細的方法。
注意到cview類在進行顯示和列印之前都會呼叫virtual void onpreparedc( cdc* pdc, cprintinfo* pinfo = null )這個虛擬成員函式來準備裝置上下文,我們可以在cview類中過載這個虛擬成員函式,進行座標轉換。
首先用vc的classwizard實現對onpreparedc( cdc* pdc, cprintinfo* pinfo = null )函式的過載,classwizard生成的源**如下:
void ctempview::onpreparedc(cdc* pdc, cprintinfo* pinfo)
如上所示,首先將座標對映方式改變為mm_anisotropic方式,即各向異性的意思,在這種座標方式下,x軸和y軸的邏輯單位可以進行任意的縮放。改變座標對映方式後,就要確定視窗大小和視口大小,注意視窗大小就是我們在螢幕上所見的尺寸,而視口大小則是實際裝置,如印表機等,和顯示器裝置每邏輯英吋的象素數量比較所得的比例尺寸。通過函式得到顯示器和印表機每邏輯英吋的象素數量,然後對視口大小進行相應的縮放,就可以使得螢幕上的顯示和印表機的輸出是一致的了。
這樣,只通過幾行簡單的**,我們就實現了所見即所得的列印。
VC 基於文件的列印
列印過程 onprepareprinting 函式進行列印中一些資訊的設定。onbeginprinting 函式建立列印資源。onpreparedc 函式設定具體列印一頁時的資訊。呼叫onprint 函式列印一頁。1 在利用嚮導生成單文件和多文件應用程式的過程中,使用者可以選擇應用程式是否支援列印和...
在VC中所見即所得列印地簡易完成
呢?本文對這種現象的原因和mfc的列印機制進行了深入的分析,並提出了一種特別簡單的方法,在原有的程式中只需加入幾行 就能解決這一問題,實現所見即所得的列印。首先,分析mfc的列印機制,把原理弄清楚了,就不難明白現象形成的原因和提出解決辦法。mfc應用程式的核心是文件物件以及相關的檢視視窗的概念,即c...
VC實現列印功能
http yesky.com 13 1700013.shtml列印api http bloghome.cn topics vc 4 22.htm列印api 設定紙張大小 if printdlg pd return false assert pd.hdc null 設定紙張大小daiguopeng,d...