2010-10-28 15 views
22

Pracuję nad projektem migracji, w którym baza danych faktycznie przechowuje rozmiary wyświetlania w twipach. Ponieważ nie mogę używać twindów do przypisywania rozmiarów do formantów WPF lub WinForms, zastanawiałem się, czy .NET ma metodę konwersji użyteczną w środowisku wykonawczym?Jak przekonwertować Twips na piksele w .NET?

+0

https://www.unitconverters.net/typography/twip-to-pixel-x.htm mówi 1 piksel = 15 twips ==> 1 twips = 1/15 px – Syed

Odpowiedz

26

Okazuje się, że narzędzie migracji ma coś, ale nie przyniesie żadnego pożytku w czasie wykonywania. Oto, co zrobiłem (jeśli zmieniona na stałe wartość w metodzie rozszerzenia została zmieniona na wartość punktów na cal, to również działa jako konwerter punktowy):

1 Twip = 1/1440th of inch. Obiekt .NET Graphics ma metodę DpiX i DpiY, której można użyć do określenia liczby pikseli w calach. Stosując te pomiary stworzyłem następujące metody rozszerzenie dla 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); 
    } 
} 

Aby korzystać z tych metod jeden po prostu musi wykonać następujące czynności (zakładając, że jesteś w sytuacji, w której CreateGraphics zwraca Drawing.Graphics obiekt (tu this jest formularz, tak CreateGraphics jest dziedziczona z Form „s super-klasy Control): sekcji

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

Patrz«Uwagi»w Graphics Class documentation o listę sposobów, aby uzyskać wykres Obiekt ics. Bardziej kompletna dokumentacja jest dostępna w tutorialu How to: Create Graphics Objects.

Krótkie podsumowanie najprostszych sposobów:

  • Control.CreateGraphics
  • zdarzenie farby PaintEventArgs ma Graphics dostępny w Graphics nieruchomości.
  • Ręka Graphics.FromImage obraz i zwróci obiekt Graphics, który może rysować na tym obrazie. (UWAGA: Jest mało prawdopodobne, że będziesz chciał użyć twipów do rzeczywistego obrazu)
+2

dostał mały błąd w kodzie. W ConvertTwipsToYPixles, masz to za pomocą DipX zamiast DpiY – Wesley

+0

@downvoter ??? Chcesz wyjaśnić? – Crisfole

+0

dzięki, mam kolejne pytanie. Powiedziałeś, że CreateGraphics zwraca obiekt Drawing.Graphics. Jaki rodzaj grafiki wraca? Czy mógłbyś podać przykład metody CreateGraphics? –

3

Dla porównania, inna wersja C#, używając API Win32 zamiast wymagających Graphics obiekty:

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 
} 

Należy podać wartość MeasureDirection, ponieważ nie ma gwarancji, że piksele są zawsze kwadratowe (zgodnie z kb).

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

+0

+1 za bezksięgowy sposób na zrobienie tego. – Crisfole

4

przypadku projektów migracyjnych możemy użyć wbudowanych funkcji wsparcia converstion

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

Stary post wiem, ale tutaj jest FYI, a niektóre matematyki na 1440 odpowiedzi powyżej ...

Twip to nie tylko 1/1440 th of a inch. Twip to 1/20 z punkt.

Punkt pracy z dokumentem w druku, zazwyczaj jest dopisek:

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

W związku z powiedzmy raport Crystal, z szerokością przekątnych 15840 (i marginesami 0 twips), szerokość będzie wynosić 11 inches (15840/(72 * 20)).

podstawie gęstości ekranu 96 dpi, raport będzie pisać na ekranie w:

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

+0

tylko dla wszystkich informacji, które korzystają z Infragistics Jeden cal to 1,440 twipów (20 punktów na pulpicie). Jeden cal to 72 punkty na pulpicie. Źródło: http://help.infragistics.com/Help/Doc/WinForms/2016.1/CLR4.0/html/Infragistics4.Documents.IO.v16.1~Infragistics.Documents.Word.WordDocumentWriter~ConvertUnits.html – Syed

Powiązane problemy