VC列印實踐淺談 (轉)
經常看到VC論壇中一些朋友問關於列印的問題,好多是問過好多遍的,其實搜尋一下原來的帖子可以找到好多,而且都是給了正確的解決方法的。但我搜了一下文件中心,發現好象關於一下我要講的內容的還沒有。所以我決定把自己在做時遇到的問題,及實現方法和心得體會寫下來,重在交流。文中如有疏漏之處,請各位朋友及時指出,以免我落個誤人誤己的下場。
在做列印模組時,經常會出於不同的目的改變印表機的預設。對於印表機配置最重要的一個結構就是DEVMODE結構(結構的具體構成請MSDN),該結構中幾乎包含了印表機的所有配置資訊。下面將給出幾個經常要用到的配置項的實現。
PRINTDLG pd; //該結構包含列印對話方塊中的所有資訊
LPDEVMODE lpDevMode;
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd)) //獲得預設的印表機的資訊
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
if(lpDevMode)
{
lpDevMode->dmPaperSize=DMPAPER_A4; //將列印紙設定為A4
lpDevMode->dmOrientation=DMORIENT_LANDSCAPE; //將印表機設定為橫向列印。
lpDevMode->dmPrintQuality=600 //列印解析度為600dpi
}
GlobalUnlock(pd.hDevMode);
}
其實,看看MSDN中DEVMODE結構的文件,套用上面這個,你就可以隨便配置你的印表機了。如果你想配置完成後,還為顯示列印對話方塊的話。可以將pd替換為printDlg.m_pd,當然你要事先定義printDlg。實現語言為“CPrintDialog printDlg(FALSE);”。下面要講的內容才是我要寫本文的初衷,這是我剛剛解決的問題,在網上貼帖子沒有人能回答的出,所以將它寫出來同各位朋友共享。
我寫的列印程式,在我的機器上列印正常,可是到了某些機器上列印就不正常了,列印的字型比我的大,整個版面都亂了。這下我可給搞糊塗了,同是一臺印表機,程式中我也設定了對映模式為MM_TEXT,怎麼可能出現這種情況呢?後來同事發現了問題的所在,因為列印時採用的解析度不同。由於我們不同的機器上裝的是不同版本的列印程式,他們預設的列印解析度也不相同。我的機器上的列印驅動預設的是1200dpi的解析度,而出問題的印表機的解析度為600dpi。所以打出來的字型比原來大了兩倍。下面我來分析一下原因:
中的字型的高度,寬度是用邏輯單元(Logical units)來表示的,邏輯單元本身並不是一種長度單位。但字型可以透過它按照一定的對映模式,經過計算後顯示在不同的裝置終端上。比如:有一個高為240個邏輯單元的字型,的對映模式為MM_TEXT(即一個邏輯單元對應一個裝置畫素),那麼字型在螢幕的輸出為240個畫素高,如果換為其他的對映模式那麼它就會在螢幕輸出不同的大小。如果我們改變了顯示器的解析度,將它的解析度調高,相應的每個畫素大小就會變小。那麼再按照MM_TEXT對映模式,將字型顯示在顯示器上,那麼此時字型也會比剛才看著小。同樣,這中情況也適於印表機,印表機的裝置畫素是點。1200dpi表示印表機每英寸可以打1200個點。600dpi表示每英寸可以打600個點。顯然對於任何字型,在解析度為600dpi的印表機上列印的大小是在1200dpi解析度印表機上列印大小的兩倍。所以為了處理這個問題我設定了一個列印係數,對於所有的列印排版所用的
引數都乘以這個係數,這樣問題就迎刃而解了。下面是得到列印係數的實現:#define PRINT_DPI_DEFAULT 1200 //我調好的程式解析度為1200dpi
m_fXCoefficient=1;//初始化列印係數PRINTDLG pd;
LPDEVMODE lpDevMode;
double fXDPI=PRINT_DPI_DEFAULT; //CPrintDialog printDlg(FALSE);
if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))
{
lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
if(lpDevMode)
{
lpDevMode->dmPaperSize=DMPAPER_A4;
}
GlobalUnlock(pd.hDevMode);
}printDlg.m_pd.hDevMode=pd.hDevMode;
if (printDlg.odal() == IDCANCEL)
return;
fXDPI=(double)lpDevMode->dmPrintQuality;
if(fXDPI>0)
{
m_fXCoefficient=fXDPI/PRINT_DPI_DEFAULT;
}唉!本人漢語能力有限,只能寫成這樣了,望各位朋友不要見怪!!!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990967/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 效能優化,實踐淺談優化
- 在VC中所見即所得列印的簡易實現 (轉)
- VC++ ADO開發實踐之三 (轉)C++
- VC++ ADO開發實踐之五 (轉)C++
- VC++ ADO開發實踐之六 (轉)C++
- VC++ ADO開發實踐之四 (轉)C++
- VC++ ADO開發實踐之七 (轉)C++
- 淺談:前端路由原理解析及實踐前端路由
- 淺談 Laravel Container 及其專案實踐LaravelAI
- 淺談報表工具的列印方案
- 淺談分散式 ID 的實踐與應用分散式
- 淺談Swift網路程式設計最佳實踐Swift程式設計
- 淺談攜程大住宿研發效能提升實踐
- 再談Delphi vs VC++(非常精彩) (轉)C++
- 淺談指標 (轉)指標
- 淺談ERP實施關鍵(轉載)
- 利用VC++開發所見即所得的列印程式 (轉)
- 淺談餐飲業如何實施ERP(轉)
- 淺談如何實行有效的專案管理(轉)專案管理
- 淺談微服務轉型微服務
- 淺談 URI 及其轉義
- 淺談php web安全 【轉】PHPWeb
- 淺談人工智慧 (轉)人工智慧
- 顏色模型淺談 (轉)模型
- 淺談研發數字化在汽車之家的落地實踐
- 淺談因果推斷與在內容平臺的實踐
- 談談 django 應用實踐Django
- 淺談MFC中超類化技術的實現 (轉)
- 淺談Unix系統管理(轉)
- 淺談java異常[Exception] (轉)JavaException
- 淺談多型——概念描述 (轉)多型
- 深入淺出談防火牆(轉)防火牆
- 函式指標淺談 (轉)函式指標
- 淺談 Java 中 this 的使用(轉)Java
- 淺談LogMiner的使用 (轉)
- 淺談react diff實現React
- 淺談影響ERP實施成功的因素(轉載)
- DTCC 2020:淺談企業資料中臺建設實踐