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);
}


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

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

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

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

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

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