WinForm打印之页边距
1.啟用頁邊距:
默認情況下PrintDocument是不理會頁邊距的(MS再次讓人無語。。。),這也是為什么有人說明明設了頁邊距在打印預覽里卻沒有效果的原因。
解決辦法是設置PrintDocument對象的OriginAtMargins屬性為True,如下:
再來看一下從元數據中提取的關于OriginAtMargins屬性的定義:
//
//?摘要:
//?????獲取或設置一個值,該值指示與頁關聯的圖形對象的位置是位于用戶指定邊距內,還是位于該頁可打印區域的左上角。
//
//?返回結果:
//?????如果圖形起始于頁面邊距,則為?true;如果圖形原點位于該頁可打印區域的左上角,則為?false。默認為?false。
[DefaultValue(false)]
public?bool?OriginAtMargins?{?get;?set;?}
可以看到此屬性的DefaultValue為false,所以如果不改的話,頁邊距設的再大也沒有用。
?
?2.PageSetupDialog中頁邊距的正常顯示
這個問題一度搞得我有點兒心煩——每打開一次“頁面設置”對話框,哪怕你不做任何更改就點“確定”關閉它,當你再打開它時你會發現,上面顯示的頁邊距“神奇地”變小了。。。
舉個具體的例子來說,如果你沒有編程預設置頁邊距的話,默認第一次打開“頁面設置”時的頁邊距應該是10mm,當你點“確定”關閉它再打開后,頁邊距變成了3.9mm,再重復這一操作,頁邊距又變成了1.5mm,依此類推。
之所以會出現不正常的現象,都是因為制式轉換導致的——
.NET對于頁邊距是絕對的“大國沙文主義”,只認美制的“英寸”不認別的制式,其默認單位是“0.01英寸”。
而我們的OS就比較入鄉隨俗,知道用“毫米”。所以在PageSetupDialog窗體上中顯示的單位是“毫米”(取決于OS)。
由于兩邊制式不一樣,搭不上話,.NET就會強制的把OS的制式單位給轉換成它“習慣”的“英寸”。 也就是說:
在你點擊“頁面設置”對話框的“確定”按鈕后,.NET會自動進行“毫米->英寸”的隱式轉換。
本來這也沒什么大不了,問題出現在:
再度打開PageSetupDialog對話框時,PageSetupDialog對象卻并沒有進行與上面的隱式轉換對應的“英寸->毫米”逆向轉換,
而僅僅是簡單粗暴地將單位名改了,從“Display”(0.01英寸)改成了“TenthsOfAMillimeter”(0.1毫米),數值卻動都沒動一下。
也就是說不管你給PageSetupDialog什么值,它都認為是以0.1毫米為單位的數。
看下面流程就明白了:
顯示10(mm)-->0.3937(in)-->39.97(0.01in)-->因為Margin尺寸只接受int型,so-->39(0.01in) -->錯誤轉換,只改單位-->39(0.1mm)-->顯示3.9(mm)
?
問題是清楚了,怎么解決呢?
?
第一個辦法(不是辦法的辦法):更改OS度量衡設置
操作系統是根據安裝時選擇的地區來確定不同的默認度量衡制式。我國用的度量衡系統是“公制”(米/厘米/毫米),而MS所在的美國用的是“美制”(英尺/英寸)。在XP系統下,可以通過“控制面板”->“區域和語言選項”->“區域選項”->“標準和格式”->“自定義”->“數字”->“度量衡系統”來設置當前的度量衡制式。把度量衡系統由“公制”改成“美國”,再去試驗一切OK,只不過頁邊距后面括號里的單位描述變成了“英寸”。OK的原因很簡單,不需要轉換了嘛。
第二個辦法:編寫代碼將英寸正確的轉換到毫米
我們可以利用.NET提供的PrinterUnitConvert類的Convert方法來實現這個目標,代碼如下:
private?void?btnPageSetup_Click(object?sender,?EventArgs?e)
{
????PageSetupDialog?psd?=?new?PageSetupDialog();
????psd.Document?=?printDocument1;
????Margins?mg?=?printDocument1.DefaultPageSettings.Margins;?//保存原始Margins
????psd.PageSettings.Margins?=?PrinterUnitConvert.Convert(mg,?PrinterUnit.Display,?PrinterUnit.TenthsOfAMillimeter);
????if?(psd.ShowDialog()?==?DialogResult.Cancel)
????{
????????//psd.PageSettings.Margins改變導致printDocument1.DefaultPageSettings.Margins也隨之改變,
????????//所以為了避免點了Cancel后,下一次打開對話框時mg被錯誤地賦給了已經改變了的printDocument1.DefaultPageSettings.Margins值,
????????//需要將printDocument1.DefaultPageSettings.Margins還原。
????????printDocument1.DefaultPageSettings.Margins?=?mg;?
????}
}
Convert方法的第三個參數必須為PrintUnit枚舉中的TenthsOfAMillimeter(0.1毫米),只有這樣才能與“錯誤轉換”后的單位一致從而顯示出正確的值。
如果上面把第三個參數換成PrinterUnit.HundredthsOfAMillimeter(0.01毫米),得到的數字要比0.1毫米的大10倍,而PageSetupDialog不管你得到的數字是多少,都會認為它是0.1毫米單位的,所以顯示出的頁邊距就會大10倍從而出錯。
?
第三個辦法:利用.NET 2.0新增的屬性
.Net 2.0中,PageSetupDialog對象新增加了一個EnableMetric屬性,MSDN中的描述是:
“獲取或設置一個值,該值指示以毫米為單位顯示邊距設置時,是否自動將邊距設置轉換為以百分之一英寸為單位(或相反)。
……
PageSettings 類以百分之一英寸為單位測量 PageSettings.Margins,但 PageSetupDialog 允許用戶以英寸或毫米為單位設置邊距,具體取決于運行該應用程序的系統的區域設置。
在 .NET Framework 2.0 版中,如果您的應用程序可能會在以毫米為單位測量文檔邊距的區域中使用,則應將此屬性設置為 true。如果要自己執行轉換(像 .NET Framework 2.0 版之前的版本所要求的那樣),則應使用默認值 false。”
此法最簡單,只要設置EnableMetric為True即可。代碼如下:
private?void?btnPageSetup_Click(object?sender,?EventArgs?e)
{
????PageSetupDialog?psd?=?new?PageSetupDialog();
????psd.Document?=?printDocument1;
????psd.EnableMetric?=?true;?//就是這句
????psd.ShowDialog();
}
轉載于:https://www.cnblogs.com/lonelyxmas/p/6922346.html
總結
以上是生活随笔為你收集整理的WinForm打印之页边距的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用jquery ajax做的select
- 下一篇: mac 下idea光标问题