Advertisement
Guest User

Metafile scaling in WinForms

a guest
Nov 10th, 2014
1,066
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.05 KB | None | 0 0
  1.    public partial class MainForm : Form
  2.    {
  3.       public MainForm()
  4.       {
  5.          InitializeComponent();
  6.       }
  7.  
  8.       private void MainForm_Paint(object sender, PaintEventArgs e)
  9.       {
  10.          var g = e.Graphics;
  11.          var blueBrush = new SolidBrush(Color.Blue);
  12.          var bluePen = new Pen(blueBrush);
  13.          g.DrawRectangle(bluePen, 0, 0, 200, 200);
  14.          g.DrawLine(bluePen, 100, 0, 100, 200);
  15.          g.DrawLine(bluePen, 0, 100, 200, 100);
  16.          g.DrawString(g.DpiX+" dpi", new Font("Arial", 10), blueBrush, 0, 205);
  17.  
  18.          Metafile metafile;
  19.          MetafileHeader metafileHeader;
  20.          var size = new Size(200, 200);
  21.          using (var stream = new MemoryStream())
  22.          {
  23.             using (Graphics offScreenBufferGraphics = Graphics.FromHwndInternal(IntPtr.Zero))
  24.             {
  25.                IntPtr deviceContextHandle = offScreenBufferGraphics.GetHdc();
  26.                metafile = new Metafile(stream, deviceContextHandle, new RectangleF(0, 0, size.Width, size.Height), MetafileFrameUnit.Millimeter, EmfType.EmfPlusOnly);
  27.                offScreenBufferGraphics.ReleaseHdc();
  28.  
  29.                using (Graphics mg = Graphics.FromImage(metafile))
  30.                {
  31.                   mg.PageUnit = GraphicsUnit.Millimeter;
  32.                   var redPen = new Pen(new SolidBrush(Color.Red));
  33.  
  34.                   // This is how to get the correct scale factor:
  35.                   metafileHeader = metafile.GetMetafileHeader();
  36.                   float sx = metafileHeader.DpiX/g.DpiX;
  37.                   float sy = metafileHeader.DpiY/g.DpiY;
  38.                   mg.ScaleTransform(sx, sy);
  39.  
  40.                   mg.DrawLine(redPen, 0, 0, 200, 200);
  41.                   mg.DrawLine(redPen, 0, 200, 200, 0);
  42.                }
  43.             }
  44.          }
  45.  
  46.          g.DrawImage(metafile, 0, 0, 200, 200);
  47.          g.DrawString("metafile.Width: " + metafile.Width, new Font("Arial", 10), blueBrush, 0, 220);
  48.          g.DrawString("metafileHeader.DpiX: " + metafileHeader.DpiX, new Font("Arial", 10), blueBrush, 0, 240);
  49.       }
  50.  
  51.    }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement