Graphics.drawstring text trail в неправильных единицахC#

Место общения программистов C#
Ответить
Anonymous
 Graphics.drawstring text trail в неправильных единицах

Сообщение Anonymous »

Код: Выделить всё

Graphics.DrawString(string, Font, Brush, RectangleF, StringFormat)
рисует мой текст в DisplayUnits (1/100 -й дюйм), когда он должен рисовать его в точках (1/72 дюйма).
Это не граница макет прямоугольник, сжимающий текст (см. Ниже). Я вручную увеличил высоту 3X, и текст не увеличился до правильного размера (4.666 ... отображаемые единицы больше), поэтому в прямоугольнике с макетом было достаточно места.

Код: Выделить всё

private void PrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
// MessageBox.Show(e.Graphics.PageUnit.ToString()); // "Display" i.e. Display Units

...

StringFormat sf = new StringFormat();
sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.NoClip;
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Near;
sf.Trimming = StringTrimming.None;

Font Arial12B = new Font(new FontFamily("Arial"), 12, FontStyle.Bold, GraphicsUnit.Point);
RectangleF layoutRect = new RectangleF(
new PointF(x, y)
new SizeF(
width, // page width
GrphxUtils.ConvertGraphicsUnit( // ensure there's vertical space
Arial12B.Size,           // 12f
from: Arial12B.Unit,     // Point
to: e.Graphics.PageUnit, // Display Unit
dpi: e.Graphics.DpiY
) // returns (correctly): 16.666666666
)
)

// Incorrectly draws it exactly 12 Display Units tall, instead of 12 Points.
e.Graphics.DrawString("Foo", Arial12B, Brushes.Black, layoutRect, sf);
}
< /code>
Почему это происходит?internal static float GetGraphicsUnitConversion(GraphicsUnit from, GraphicsUnit to, float DPI)
{
if (from == GraphicsUnit.World || to == GraphicsUnit.World)
throw new NotImplementedException("GraphicsUnit.World not supported");

// [from, to]
float[,] convTable = new float[7, 7]
{
// World, Display,      Pixel,       Point,         Inch,    Document,      Millimeter
{ 0f,     0f,            0f,          0f,            0f,      0f,            0f},                // From World
{ 0f,     1f,            DPI*1f/100f,  72f*1f/100f,    1f/100f,  300f*1f/100f,   25.4f*1f/100f},  // From Display
{ 0f,     100f/DPI,      1f,          72f*1f/DPI,     1f/DPI,   300f*1f/(DPI),  25.4f*1f/DPI},   // From Pixel
{ 0f,     100f*1f/72f,   DPI*1f/72f,   1f,            1f/72f,   300f*1f/72f,    25.4f*1f/72f},   // From Point
{ 0f,     100f*1f,       1f*DPI,       72f*1f,         1f,      300f*1f,        25.4f*1f},       // From Inch
{ 0f,     100f*1f/300f,  DPI*1f/300f,  72f*1f/300f,    1f/300f,  1f,            25.4f*1f/300f},  // From Document
{ 0f,     100f*1f/25.4f, DPI*1f/25.4f, 72f*1f/25.4f,   1f/25.4f, 300f*1f/25.4f,  1f},            // From Millimeter
};

return convTable[(int)from, (int)to];
}

internal static float ConvertGraphicsUnit(float l, GraphicsUnit from, GraphicsUnit to, float DPI)
{
if (from == GraphicsUnit.World || to == GraphicsUnit.World)
throw new NotImplementedException("GraphicsUnit.World not supported");

return l * GetGraphicsUnitConversion(from, to, DPI);
}
Обновление: Я также пытался:
  • Настройка e.graphics.pageunit = graphicsUnit.point и корректировка прямоугольника макета, чтобы соответствовать моментам, и затем я сделал то же самое с тем же, что и на подразделение документов (1/300 in). e.graphics.pageUnit и повышение размера размера шрифта, чтобы соответствовать (например, для отображения единиц Установки размера шрифта как 16,66666666, который составляет 12 баллов, примерно).
Во всех случаях, когда я печатаю и . высокий.

Подробнее здесь: https://stackoverflow.com/questions/796 ... rect-units
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»