public void PrintDocument_PrintPage(object sender, PrintPageEventArgs e) { // we do not use the buffers when printing (the printer is probably higher-resolution!) Graphics gr = e.Graphics; Page page = CurrentDocument.Page(m_PrintPageIndex); e.PageSettings.Landscape = page.IsLandscape; gr.ResetTransform(); gr.PageUnit = GraphicsUnit.Pixel; // GraphicsUnit.Millimeter ' it shows 600 DPI which makes the usual scaling conversion for mono impossible SizeF printable = e.PageSettings.PrintableArea.Size.MultiplyBy(Geometry.INCH / 100); // in mm. Apparently e.MarginBounds or e.PageSettings.PrintableArea is in hundredths of an inch (?) if (page.IsLandscape) { printable = printable.Flip(); // But sadly e.PageSettings.PrintableArea does not account for orientation } var pageSize = page.Size; // max scale that will fit: var scale = Math.Min(printable.Width / pageSize.Width, printable.Height / pageSize.Height); if (scale > 0.97f) // will not fit at full size (allow a bit <1 in case of slight margin issues) { scale = 1; // don't shrink } else { pageSize.Width *= scale; // update page size for centreing below pageSize.Height *= scale; } gr.ScaleTransform(scale * gr.DpiX / Geometry.INCH, scale * gr.DpiY / Geometry.INCH); gr.TranslateTransform(0, page.Size.Height - 1); // centre it gr.TranslateTransform(scale * (pageSize.Width - pageSize.Width) / 2, scale * (pageSize.Height - pageSize.Height) / 2); // No need to take account of the margins if we are centring it anyway //gr.TranslateTransform(m_objPage.Margin - INCH * e.PageSettings.HardMarginX / 100, m_objPage.Margin - INCH * e.PageSettings.HardMarginY / 100) gr.SmoothingMode = SmoothingMode.AntiAlias; gr.TextRenderingHint = TextRenderingHint.AntiAlias; // otherwise text on transparent buffer is naff using (NetCanvas canvas = new NetCanvas(gr, true)) { page.DrawBackground(canvas, scale * gr.DpiX / Geometry.INCH, page.Paper.PrintBackground, false); if (page != CurrentPage) { page.BackgroundImage?.Release(); // avoid overload if document has masses of large pages } if (e.PageSettings.PrinterSettings.PrintRange == PrintRange.Selection) { page.DrawSelected(canvas, null, scale, gr.DpiX / Geometry.INCH, true); } else { page.DrawShapes(canvas, scale, gr.DpiX / Geometry.INCH, null, !PrintMeasures); } } m_PrintPageIndex += 1; switch (m_PrintDocument.PrinterSettings.PrintRange) { case PrintRange.CurrentPage: case PrintRange.Selection: e.HasMorePages = false; break; default: e.HasMorePages = m_PrintPageIndex + 1 <= m_PrintDocument.PrinterSettings.ToPage; // +1 is the conversion from 0-based to 1-based break; } }
protected override Bitmap CreateSampleImage2(int size) { if (CustomRequiresParameter) { return(Resources.AM.GreyQuestion_32); } Bitmap bitmap = new Bitmap(32, 32, System.Drawing.Imaging.PixelFormat.Format32bppArgb); using (Graphics gr = Graphics.FromImage(bitmap)) { using (NetCanvas canvas = new NetCanvas(gr)) { gr.Clear(Color.Transparent); gr.SmoothingMode = SmoothingMode.AntiAlias; switch (Change) { case Parameters.FillColour: gr.Clear(Color.FromArgb(Value)); break; case Parameters.FillPattern: if ((Shape.FillStyleC.Patterns)Value == Shape.FillStyleC.Patterns.Solid) { gr.Clear(Color.Black); } // leave it white else if ((Shape.FillStyleC.Patterns)Value == Shape.FillStyleC.Patterns.Empty) { } else if ((Shape.FillStyleC.Patterns)Value == Shape.FillStyleC.Patterns.Texture) { gr.Clear(Color.Gray); Debug.Fail("Cannot create sample image for Texture pattern"); } else { HatchBrush br = new HatchBrush((HatchStyle)Value, Color.Black, Color.Empty); gr.FillRectangle(br, 0, 0, 32, 32); br.Dispose(); } break; case Parameters.LineColour: using (Pen pn = new Pen(Color.FromArgb(Value), 2)) gr.DrawLine(pn, 1, 1, 30, 30); break; case Parameters.TextColour: using (Font objFont = new Font(FontFamily.GenericSerif, 10)) using (SolidBrush br = new SolidBrush(Color.FromArgb(Value))) gr.DrawString("Ab", objFont, br, 2, 10); break; case Parameters.LineWidth: using (Pen pn = new Pen(Color.Black, Value / 100f * gr.DpiX / Geometry.INCH)) gr.DrawLine(pn, 1, 1, 30, 30); break; case Parameters.LinePattern: using (Pen pn = new Pen(Color.Black, 2)) { pn.DashStyle = (DashStyle)Value; gr.DrawLine(pn, 1, 1, 30, 30); } break; case Parameters.TextAlignment: switch ((StringAlignment)Value) { case StringAlignment.Near: return((Bitmap)GUIUtilities.RM.GetObject("TextLeft")); case StringAlignment.Center: return((Bitmap)GUIUtilities.RM.GetObject("TextCentre")); case StringAlignment.Far: return((Bitmap)GUIUtilities.RM.GetObject("TextRight")); default: return(null); } case Parameters.TextVerticalAlignment: switch ((StringAlignment)Value) { case StringAlignment.Near: return((Bitmap)GUIUtilities.RM.GetObject("TextTop")); case StringAlignment.Center: return((Bitmap)GUIUtilities.RM.GetObject("TextMiddle")); case StringAlignment.Far: return((Bitmap)GUIUtilities.RM.GetObject("TextBottom")); } break; case Parameters.ArrowheadEndSize: case Parameters.ArrowheadStartSize: DrawArrowhead(canvas, Lined.ArrowheadC.Styles.SimpleSolid, Value); break; case Parameters.ArrowheadEndType: case Parameters.ArrowheadStartType: DrawArrowhead(canvas, (Lined.ArrowheadC.Styles)Value, Lined.ArrowheadC.DEFAULTSIZE); break; default: gr.Clear(Color.Gray); Debug.Fail("Unexpected parameter in CreateParameterSampleImage: " + Change); break; } } } return(bitmap); }