| File: System\Drawing\Printing\PrintPreviewGraphics.cs | Web Access |
| Project: src\winforms\src\System.Drawing.Common\src\System.Drawing.Common.csproj (System.Drawing.Common) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Drawing.Printing; namespace System.Drawing; /// <summary> /// Retrieves the printer graphics during preview. /// </summary> internal sealed class PrintPreviewGraphics { private readonly PrintPageEventArgs _printPageEventArgs; private readonly PrintDocument _printDocument; public PrintPreviewGraphics(PrintDocument document, PrintPageEventArgs e) { _printPageEventArgs = e; _printDocument = document; } /// <summary> /// Gets the Visible bounds of this graphics object. Used during print preview. /// </summary> public RectangleF VisibleClipBounds { get { HGLOBAL hdevmode = _printPageEventArgs.PageSettings.PrinterSettings.GetHdevmodeInternal(); using var hdc = _printPageEventArgs.PageSettings.PrinterSettings.CreateDeviceContext(hdevmode); using Graphics graphics = Graphics.FromHdcInternal(hdc); if (_printDocument.OriginAtMargins) { // Adjust the origin of the graphics object to be at the user-specified margin location // Note: Graphics.FromHdc internally calls SaveDC(hdc), we can still use the saved hdc to get the resolution. int dpiX = PInvokeCore.GetDeviceCaps(hdc, GET_DEVICE_CAPS_INDEX.LOGPIXELSX); int dpiY = PInvokeCore.GetDeviceCaps(hdc, GET_DEVICE_CAPS_INDEX.LOGPIXELSY); int hardMarginX_DU = PInvokeCore.GetDeviceCaps(hdc, GET_DEVICE_CAPS_INDEX.PHYSICALOFFSETX); int hardMarginY_DU = PInvokeCore.GetDeviceCaps(hdc, GET_DEVICE_CAPS_INDEX.PHYSICALOFFSETY); float hardMarginX = hardMarginX_DU * 100 / dpiX; float hardMarginY = hardMarginY_DU * 100 / dpiY; graphics.TranslateTransform(-hardMarginX, -hardMarginY); graphics.TranslateTransform(_printDocument.DefaultPageSettings.Margins.Left, _printDocument.DefaultPageSettings.Margins.Top); } return graphics.VisibleClipBounds; } } }