呢?本文對這種現象的原因和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)
我們只需在源**中加入以下幾行**即可,如下:
void cprintsameview::onpreparedc(cdc* pdc, cprintinfo* pinfo)
如上所示,首先將座標對映方式改變為mm_anisotropic方式,即各向異性的意思,在這種座標方式下,x軸和y軸的邏輯單位可以進行任意的縮放。改變座標對映方式後,就要確定視窗大小和視口大小,注意視窗大小就是我們在螢幕上所見的尺寸,而視口大小則是實際裝置,如印表機等,和顯示器裝置每邏輯英吋的象素數量比較所得的比例尺寸。通過函式得到顯示器和印表機每邏輯英吋的象素數量,然後對視口大小進行相應的縮放,就可以使得螢幕上的顯示和印表機的輸出是一致的了。
這樣,只通過幾行簡單的**,我們就實現了所見即所得的列印。
swift IB中所見即所得
平時開發中,經常會遇到設定控制項的圓角 邊框 陰影等簡單的顯示特效。剛開始通常我們都是會用 去設定,有時為了設定乙個按鈕的特性寫了好幾行無腦 更關鍵的是即使擼完 了,還是不能即時看到效果,要執行模擬器,如果不滿意效果,還要一點點去修改,再去執行看效果,費時費力並且沒有任何技術含量。正文開始 第一種方...
所見即所得
看到的只有認真總結積累沉澱,才能做到所見即所得!一直提倡開源,閉源阻礙不了社會的進步,只會使自己退步,因為跟不上時代,不進則退。週末筆記,不嚴謹,只是對技術的執著!沒有比較很難去發現自己的問題,短時間內提供演算法到最優,需要對業務和演算法深刻的洞察,問題肯定是有解決方法的,遇到問題請問一句自己 針對...
所見即所得
收藏檢視 我的收藏 231有用 1 已投票 9 編輯鎖定 所見即所得是一種系統。它使得使用者在檢視中所看到文件與該文件的最終產品具有相同的樣式,也允許使用者在檢視中直接編輯文字 圖形 或文件中的其他元素。wysiwyg 語言常常比標籤語言容易使用,因為標籤語言並沒有對各種改變提供即時的視覺上的反饋。...