日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WinForm打印之页边距

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WinForm打印之页边距 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
WinForm打印之頁邊距 原文:WinForm打印之頁邊距

1.啟用頁邊距:


默認情況下PrintDocument是不理會頁邊距的(MS再次讓人無語。。。),這也是為什么有人說明明設了頁邊距在打印預覽里卻沒有效果的原因。
解決辦法是設置PrintDocument對象的OriginAtMargins屬性為True,如下:

printDocument1.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();
}


? posted on 2017-05-31 01:27 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/6922346.html

總結

以上是生活随笔為你收集整理的WinForm打印之页边距的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。