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
Graphics.drawstring text trail в неправильных единицах ⇐ C#
Место общения программистов C#
-
Anonymous
1751301770
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);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79682301/graphics-drawstring-drawing-text-in-incorrect-units[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия