Как я могу конвертировать Twips в пиксели в .NET? - PullRequest
24 голосов
/ 28 октября 2010

Я работаю над проектом миграции, в котором база данных на самом деле хранит размеры экрана в два раза. Поскольку я не могу использовать твипы для назначения размеров элементам управления WPF или Winforms, мне было интересно, есть ли в .NET метод преобразования, используемый во время выполнения?

Ответы [ 4 ]

28 голосов
/ 28 октября 2010

Оказывается, что в инструменте миграции есть что-то, но оно не принесет пользы во время выполнения.Вот что я сделал (если бы жестко закодированное значение в методе расширения было изменено на значение для точек на дюйм, оно также работало бы как преобразователь точек):

1 Twip = 1/1440-ая дюйма.У объекта .NET Graphics есть методы DpiX и DpiY, которые можно использовать для определения количества пикселей в дюйме.Используя эти измерения, я создал следующие методы расширения для 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);
    }
}

Чтобы использовать эти методы, нужно просто сделать следующее (предполагая, что вы находитесь в контексте, где CreateGraphics возвращает Drawing.Graphics объект (здесь this является формой, поэтому CreateGraphics наследуется от суперкласса Form Control):

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

См. раздел «Замечания» в Graphics Документация класса для получения списка способов получения графического объекта. Более полная документация доступна в руководстве Как: создавать графические объекты .

Краткое описаниесамые простые способы:

  • Control.CreateGraphics
  • для события Paint * PaintEventArgs имеет Graphics, доступное в свойстве Graphics.
  • Hand Graphics.FromImageизображение, и он вернет объект Graphics, который может рисовать на этом изображении (ПРИМЕЧАНИЕ. Маловероятно, что вы захотите использовать твипы для реального изображения)
4 голосов
/ 15 июля 2012

Для проектов миграции мы можем использовать встроенные функции поддержки разговоров

microsoft.visualbasic.compatibility.vb6.twipsperpixelx
microsoft.visualbasic.compatibility.vb6.twipsperpixely
4 голосов
/ 14 декабря 2010

Для справки, другая версия C #, использующая Win32 API вместо того, чтобы требовать Graphics объекты:

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
}

Предполагается, что MeasureDirection указан, поскольку нет гарантии, что пиксели всегдаквадрат (в соответствии с килобайтом).

Ссылка: kb210590: ACC2000: Как преобразовать двойки в пиксели

2 голосов
/ 21 марта 2014

Старый пост, который я знаю, но здесь к вашему сведению и немного математики для 1440 ответов выше ...

Твип - это не просто 1/1440 дюйм дюйма. Твип 1/20 из балла .

Точкой, с которой вы работаете в печатном документе, обычно является постскриптум 72dpi:

72dpi * 20Twips/Point = 1440twips.

Так, например, при работе с отчетом Crystal, ширина которого составляет 15840 (и поля равны 0) ширина будет 11 inches (15840 / (72 * 20)).

При плотности экрана 96 точек на дюйм отчет будет размещен на экране по адресу:

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

...