I'm working on a migration project in which a database actually stores display sizes in twips. Since I can't use twips to assign sizes to WPF or Winforms controls, I was wondering if .NET has a conversion method usable at runtime?
One twip is 1⁄1440 inch, or 17.64 μm.
It turns out that the migration tool has something, but it wouldn't do any good at runtime. Here's what I did (if the hard-coded value in the extension method were changed to the value for points per inch it would work as a point converter too):
1 Twip = 1/1440th of an inch. The .NET Graphics
object has a method DpiX
and DpiY
which can be used to determine how many pixels are in an inch. Using those measurements I created the following extension methods for Graphics
:
using System.Drawing; static class Extensions { /// <summary> /// Converts an integer value in twips to the corresponding integer value /// in pixels on the x-axis. /// </summary> /// <param name="source">The Graphics context to use</param> /// <param name="inTwips">The number of twips to be converted</param> /// <returns>The number of pixels in that many twips</returns> public static int ConvertTwipsToXPixels(this Graphics source, int twips) { return (int)(((double)twips) * (1.0 / 1440.0) * source.DpiX); } /// <summary> /// Converts an integer value in twips to the corresponding integer value /// in pixels on the y-axis. /// </summary> /// <param name="source">The Graphics context to use</param> /// <param name="inTwips">The number of twips to be converted</param> /// <returns>The number of pixels in that many twips</returns> public static int ConvertTwipsToYPixels(this Graphics source, int twips) { return (int)(((double)twips) * (1.0 / 1440.0) * source.DpiY); } }
To use these methods one simply has to do the following (assuming you're in a context where CreateGraphics
returns a Drawing.Graphics
object (here this
is a Form, so CreateGraphics
is inherited from Form
's super-class Control
):
using( Graphics g = CreateGraphics() ) { Width = g.ConvertTwipsToXPixels(sizeInTwips); Height = g.ConvertTwipsToYPixels(sizeInTwips); }
See the "Remarks" section in the Graphics
Class documentation for a list of ways to obtain a graphics object. More complete documentation is available in the tutorial How to: Create Graphics Objects.
Brief summary of easiest ways:
Control.CreateGraphics
PaintEventArgs
has a Graphics
available in its Graphics
property.Graphics.FromImage
an image and it will return a Graphics
object that can draw on that image. (NOTE: It is unlikely that you'll want to use twips for an actual image)For migration projects we can use built in converstion support functions
microsoft.visualbasic.compatibility.vb6.twipsperpixelx microsoft.visualbasic.compatibility.vb6.twipsperpixely
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With