Код: Выделить всё
Graphics.DrawString(string, Font, Brush, RectangleF, StringFormat)Это не граница макет прямоугольник, сжимающий текст (см. Ниже). Я вручную увеличил высоту 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
Мобильная версия