У нас есть приложение VB6, используемое для печати, которое мы сейчас не можем переписать в .NET.:) Проблема, которую мы ищем, заключается в том, что печатный текст не совсем соответствует предварительному просмотру пользовательского интерфейса.У нас есть собственный элемент управления текстового поля, который обрабатывает рисование и печать самостоятельно, используя ExtTextOut и TextOut соответственно.Их вывод должен быть одинаковым, но при одинаковом шрифте текст может быть больше на экране или на принтере.Высоты идеальны, различаются только расстояние и ширина символа.Я еще не уверен, что это проблема кернинга шрифта, но разница зависит от DPI принтера как для расстояния, так и для ширины символа.Более высокий DPI, большая разница.4000 точек на дюйм в результате дают более тонкие символы.Но я могу быть уверен, что мы где-то неправильно работаем с DPI.
Следующий код относится к типу печати, который устанавливает шрифт и печатает некоторый текст.
fntHeight = MulDiv(m_Font.SIZE, GetDeviceCaps(printerDC, LOGPIXELSY), 72)
fnt = CreateFont(-fntHeight, 0, escapement, escapement, FW_BOLD, Font.Italic, Font.Underline, _
Font.Strikethrough, Font.Charset, 0, CLIP_LH_ANGLES, FontQuality, 0, Font.Name)
SelectObject(printerDC, fnt)
TextOutW(printerDC, x, y, StrPtr(strOutputText), Len(strOutputText))
Краскакод для пользовательского интерфейса очень похож.Проблема, которую видят пользователи: пользовательский интерфейс не является хорошим индикатором для определения, когда размер текстового поля слишком мал, потому что, если текст на DC принтера немного шире, чем DC экрана, последний символ, такой как точка, обрезается.
Эта разница зависит от размера шрифта, а при 28 разница равна 0. Она может легко варьироваться от +14 до -14, при этом ширина печатного или окрашенного текста будет больше.Я до сих пор не смог выяснить, что заставляет TextOut, ExtTextOut и GetTextExtentPoint32 давать разные результаты.
Этот код вычисляет разницу и используется событием рисования при попытке настроить интервал для его учетано было бы лучше, если бы мы могли выяснить, почему, во-первых, есть разница, поскольку она не может объяснить разницу в ширине символов.GetTextExtentPoints32 скрыт за вызовом TextWidthU.
' Call GetTextExtentPoint32W(hdc, StrPtr(strText), Len(strText), textSize)
printerTextWidth = TextWidthU(printerDC, strOutputText) * (screenXdpi / printerXdpi)
screenTextWidth = TextWidthU(UserControl.hdc, strOutputText)
totalDifference = printerTextWidth - screenTextWidth