PageSetupDialog 类的一个 BUG

我们在用 C# 语言编写 WinForm 程序时,如果在程序中需要打印一些东东的话,经常需要先使用页面设置对话框进行一些设置。而 Microsoft .NET Framework Base Class Library 已经为我们考虑得很周到了,我们只需要使用 System.Windows.Forms 命名空间中的PageSetupDialog类就行了。但是这个类有个小小的 BUG,下面就是相应的测试程序 PageSetupTester.cs:

001: using System;002: using System.Drawing;003: using System.Windows.Forms;004: using System.Globalization;005: using System.Drawing.Printing;Skyiv.Tester008: {: Form010: {011: PageSetupDialog setupB;012: 013: PageSetupTester()014: {015: Text = "页面设置测试";016: Width = 380;lbl = new Label();019: lbl.Parent = this;020: lbl.Text = string.Format(021: " OS: {1}{0}CLR: {2} ( {3} ){0}{4}{5}{0}{0}{6}{0}{7}{0}{8}{0}{9}{0}{10}",022: Environment.NewLine,023: Environment.OSVersion,024: Environment.Version,025: RuntimeFramework.CurrentFramework,026: "控制面板的区域选项的度量衡系统为",027: (RegionInfo.CurrentRegion.IsMetric ? "公制。" : "英制。"),028: "当度量衡系统为公制,且操作系统为Windows时,",029: "显示在页面设置对话框中的当前页边距是以公制为单位的数值,",030: "按下“确定”时,PageSetupDialog类内部却把屏幕上显示的",031: "页边距数值按英制为单位对页面进行设定,",032: "造成页边距不断减少的BUG。");033: lbl.Top = 10;034: lbl.AutoSize = true;docA = new PrintDocument();037: docA.PrintPage += PrintPage;();039: setupA.Document = docA;btnPageSetupA = new Button();042: btnPageSetupA.Parent = this;043: btnPageSetupA.Text = "页面设置A(可能有BUG)";044: btnPageSetupA.Top = 145;045: btnPageSetupA.Width = 150;046: btnPageSetupA.Click += (sender, e) => setupA.ShowDialog();btnPreviewA = new Button();049: btnPreviewA.Parent = this;050: btnPreviewA.Text = "打印预览A";051: btnPreviewA.Top = btnPageSetupA.Top;052: btnPreviewA.Left = btnPageSetupA.Right + 5;053: btnPreviewA.Width = 100;054: btnPreviewA.Click += (sender, e) => PreviewPrint(docA);docB = new PrintDocument();057: docB.PrintPage += PrintPage;058: setupB = new PageSetupDialog();059: setupB.Document = docB;btnSetupB = new Button();062: btnSetupB.Parent = this;063: btnSetupB.Text = "页面设置B(修正)";064: btnSetupB.Top = btnPageSetupA.Top + 30;065: btnSetupB.Width = 150;066: btnSetupB.Click += PageSetupBClick;btnPreviewB = new Button();069: btnPreviewB.Parent = this;070: btnPreviewB.Text = "打印预览B";071: btnPreviewB.Top = btnSetupB.Top;072: btnPreviewB.Left = btnSetupB.Right + 5;073: btnPreviewB.Width = 100;074: btnPreviewB.Click += (sender, e) => PreviewPrint(docB);075: }PrintPage(object o, PrintPageEventArgs e)078: {079: Graphics g = e.Graphics;080: Rectangle r = e.MarginBounds;081: g.DrawRectangle(new Pen(Color.Red), r);(Color.Blue), r);083: }PreviewPrint(PrintDocument doc)086: {();088: doc.PrintController = ppc;089: doc.Print();(ppc.GetPreviewPageInfo()).ShowDialog();091: }PageSetupBClick(object o, EventArgs e)094: {095: // 当前线程所使用的区域选项的度量衡系统为公制,且操作系统为Windows时,096: // 显示在页面设置对话框中的当前页边距是以公制为单位的数值,097: // 按下“确定”时,PageSetupDialog类内部却把屏幕上显示的098: // 页边距数值按英制为单位对页面进行设定,099: // 造成页边距不断减少的BUG。100: // 以下代码就是为了纠正这个BUG的。101: if (setupB.ShowDialog() == DialogResult.OK && RegionInfo.CurrentRegion.IsMetric102: && Environment.OSVersion.Platform != PlatformID.Unix)103: {104: setupB.PageSettings.Margins = PrinterUnitConvert.Convert105: (setupB.PageSettings.Margins, PrinterUnit.Display, PrinterUnit.TenthsOfAMillimeter);106: }107: }108: 109: [STAThread]110: static void Main()111: {112: Application.EnableVisualStyles();());114: }115: }116: }

却不去主动改变,而是放任它的生活态度。

PageSetupDialog 类的一个 BUG

相关文章:

你感兴趣的文章:

标签云: