2010-10-28 6 views
22

Ich arbeite an einem Migrationsprojekt, in dem eine Datenbank tatsächlich Displaygrößen in Twips speichert. Da ich Twips nicht verwenden kann, um WPF- oder Winforms-Steuerelementen Größen zuzuweisen, habe ich mich gefragt, ob .NET eine zur Laufzeit verwendbare Konvertierungsmethode hat?Wie konvertiere ich Twips zu Pixel in .NET?

+0

https://www.unitconverters.net/typography/twip-to-pixel-x.htm sagt 1 Pixel = 15 twips ==> 1 twips = 1/15 px – Syed

Antwort

26

Es stellt sich heraus, dass das Migrationstool etwas hat, aber es würde zur Laufzeit nicht gut tun. Hier ist, was ich getan habe (wenn der hartcodierte Wert in der Erweiterungsmethode auf den Wert für Punkte pro Zoll geändert wurde, würde es auch als Punktkonverter funktionieren):

1 Twip = 1/1440. eines Zolls. Das Objekt .NET Graphics verfügt über eine Methode DpiX und DpiY, die verwendet werden kann, um festzustellen, wie viele Pixel in einem Zoll sind. diese Messungen verwenden habe ich die folgenden Erweiterungsmethoden für 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); 
    } 
} 

diese Methoden verwenden man einfach die folgende (vorausgesetzt, Sie in einem Kontext sind zu tun hat, wo CreateGraphics ein Drawing.Graphics Objekt zurückgibt (hier this ist ein Form, so wird CreateGraphics geerbt von Form ‚s Super-Klasse Control):

using(Graphics g = CreateGraphics()) 
{ 
    Width = g.ConvertTwipsToXPixels(sizeInTwips); 
    Height = g.ConvertTwipsToYPixels(sizeInTwips); 
} 

Siehe Abschnitt "Hinweise" in den Graphics Class documentation für eine Liste von Möglichkeiten, um eine grafische Darstellung zu erhalten ics-Objekt. Eine ausführlichere Dokumentation finden Sie im Tutorial How to: Create Graphics Objects.

Kurze Zusammenfassung der einfachsten Möglichkeiten:

  • Control.CreateGraphics
  • ein PaintEventArgs Paint Ereignis hat eine Graphics in seiner Graphics Eigenschaft.
  • Hand Graphics.FromImage ein Bild und es wird ein Graphics Objekt zurückgegeben, das auf diesem Bild zeichnen kann. (Hinweis: Es ist unwahrscheinlich, dass Sie twips für ein aktuelles Bild verwenden werden wollen)
+2

hat einen kleinen Fehler in Ihrem Code. In den ConvertTwipsToYPixles, haben Sie es mit dem DipX anstelle des DpiY – Wesley

+0

@ downvoter ??? Möchten Sie das erklären? – Crisfole

+0

danke, ich habe eine andere Frage. Sie haben gesagt, dass CreateGraphics ein Drawing.Graphics-Objekt zurückgibt. Welche Art von Grafiken gibt es zurück? Können Sie bitte ein Beispiel für die CreateGraphics-Methode geben? –

3

als Referenz, eine andere C# Version, mit dem Win32-API statt erfordern ein Graphics Objekte:

using System.Runtime.InteropServices; 

static class SomeUtils { 

    public static int ConvertTwipsToPixels(int twips, MeasureDirection direction) { 
    return (int)(((double)twips)*((double)GetPixperinch(direction))/1440.0); 
    } 

    public static int ConvertPixelsToTwips(int pixels, MeasureDirection direction) { 
    return (int)((((double)pixels)*1440.0)/((double)GetPixperinch(direction))); 
    } 

    public static int GetPPI(MeasureDirection direction) { 
    int ppi; 
    IntPtr dc = GetDC(IntPtr.Zero); 

    if (direction == MeasureDirection.Horizontal) 
     ppi = GetDeviceCaps(dc, 88); //DEVICECAP LOGPIXELSX 
    else 
     ppi = GetDeviceCaps(dc, 90); //DEVICECAP LOGPIXELSY 

    ReleaseDC(IntPtr.Zero, dc); 
    return ppi; 
    } 

    [DllImport("user32.dll")] 
    static extern IntPtr GetDC(IntPtr hWnd); 

    [DllImport("user32.dll")] 
    static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC); 

    [DllImport("gdi32.dll")] 
    static extern int GetDeviceCaps(IntPtr hdc, int devCap); 
} 

public enum MeasureDirection { 
    Horizontal, 
    Vertical 
} 

Die MeasureDirection soll angegeben werden, da es keine Garantie gibt, dass Pixel immer quadratisch sind (gemäß der kb).

Referenz: kb210590: ACC2000: How to Convert Twips to Pixels

+0

+1 für eine Grafik-Kontext-freie Möglichkeit, dies zu tun. – Crisfole

4

Für Migrationsprojekte können wir in converstion Support-Funktionen gebaut werden, benutzen

microsoft.visualbasic.compatibility.vb6.twipsperpixelx 
microsoft.visualbasic.compatibility.vb6.twipsperpixely 
2

Alte Post Ich weiß, aber hier ist ein FYI und einige Mathematik für die 1440 Antworten oben ...

Ein twip ist nicht einfach 1/1440 th von einem Zoll. Ein Twip ist 1/20 eines Punkt.

Der Punkt, den Sie mit in ein druckbares Dokument arbeiten, ist in der Regel ein Nachsatz:

72dpi. 72dpi * 20Twips/Point = 1440twips.

Also im Umgang mit sagen, ein Crystal Reports-Bericht, mit einer Breite von twips 15840 (und Margen von 0 twips), die Breite 11 inches (15840/(72 * 20)) wäre.

auf einem Bildschirm Dichte von 96 dpi Basierend, wird der Bericht auf dem Bildschirm schreiben an:

1056px wide (96dpi * 11in = 1056px).

+0

nur für alle Ihre Informationen, die Infragistics verwenden Ein Zoll entspricht 1440 twips (zwanzigstel eines Desktop-Punkt). Ein Zoll entspricht 72 Desktop-Punkten. Quelle: http://help.infragistics.com/Help/Doc/WinForms/2016.1/CLR4.0/html/Infragistics4.Documents.IO.v16.1~Infragistics.Documents.Word.WordDocumentWriter~ConvertUnits.html – Syed

Verwandte Themen