Конвертировать единицы печати в ММ
У меня установлен принтер на ММ. Я пытаюсь понять, как центрировать текст при печати, используя следующий код:
Dim CentrePage As Single
CentrePage = Convert.ToString((e.PageBounds.Width / 2) - (e.Graphics.MeasureString("SENpic Report - " & Format(Now, "dddd, dd MMMM, yyyy") & " - Page " & prnPage, f).Width / 2))
e.Graphics.DrawString("SENpic Report - " & Format(Now, "dddd, dd MMMM, yyyy") & " - Page " & prnPage, f, br, CentrePage, 17)
Теперь я знаю, что речь идет о единицах, и я думаю, что одна в ММ, но я не уверен, что такое другая единица, поэтому я не могу определить коэффициент пересчета для него.
Есть идеи?
5 ответов
Graphics.PageUnit по умолчанию, который вы получаете в обработчике события PrintPage, это GraphicsUnit.Display. Который отображает 100 пикселей на дюйм. Это удобная настройка, она позволяет рисовать объекты на бумаге примерно того же размера, что и вы, когда рисуете их на экране. Видеоадаптеры обычно работают с разрешением 96 точек на дюйм. Помогает вам написать графический код, который работает как для принтера, так и для экрана.
Вы можете просто переназначить его. Вы, конечно, ищете GraphicsUnit.Millimeter.
Имейте в виду, что это никак не влияет на центрирование текста. Что, конечно, работает так же хорошо, когда вы измеряете в миллиметрах, как в 0,01 дюйма.
После долгих потрясений я сделал это:
В основном я установил графический блок на миллиметры. Несмотря на то, что это было установлено, границы страницы по-прежнему возвращаются в пикселях, НО строка мера возвращает миллиметры.
После многих проб и ошибок я обнаружил, что для преобразования границ страницы в миллиметры необходимо умножить его на 0,264583333, это размер пикселя в миллиметрах.
Вот код:
e.Graphics.PageUnit = GraphicsUnit.Millimeter
Dim f As Font = New Font("Vanada", 12)
Dim br As SolidBrush = New SolidBrush(Color.Black)
Dim CentrePage As Single
Dim CentreText As String = "My Report - " & Format(Now, "dddd, dd MMMM, yyyy") & " - Page " & prnPage
CentrePage = Convert.ToString(((e.PageBounds.Width * 0.264583333) / 2) - (e.Graphics.MeasureString(CentreText, f).Width / 2))
e.Graphics.DrawString(CentreText, f, br, Int(CentrePage), 17)
Я надеюсь, что это помогает другим.
Public Class Form1
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
e.Graphics.PageUnit = GraphicsUnit.Millimeter
Dim TEXT_RIGHT As New StringFormat
TEXT_RIGHT.LineAlignment = StringAlignment.Center
TEXT_RIGHT.Alignment = StringAlignment.Far
Dim TEXT_LEFT As New StringFormat
TEXT_LEFT.LineAlignment = StringAlignment.Center
TEXT_LEFT.Alignment = StringAlignment.Near
Dim TEXT_CENTER As New StringFormat
TEXT_CENTER.LineAlignment = StringAlignment.Center
TEXT_CENTER.Alignment = StringAlignment.Center
Dim FONT1 As Font = New Font("ARIAL", 16, FontStyle.Bold Or FontStyle.Italic)
Dim P1 As Point = New Point(100, 20)
e.Graphics.DrawLine(Pens.Blue, P1, New Point(P1.X, P1.Y + 150))
e.Graphics.DrawString("THIS IS CENTERED TEXT", FONT1, Brushes.Red, _
P1, TEXT_CENTER)
P1 = New Point(P1.X, P1.Y + 10)
e.Graphics.DrawString("THIS IS RIGHT TEXT", FONT1, Brushes.Red, _
P1, TEXT_RIGHT)
P1 = New Point(P1.X, P1.Y + 10)
e.Graphics.DrawString("THIS IS RIGHT LEFT", FONT1, Brushes.Red, _
P1, TEXT_LEFT)
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PrintPreviewControl1.Width = Me.Width - PrintPreviewControl1.Left - 50
PrintPreviewControl1.Height = Me.Height - PrintPreviewControl1.Top - 50
PrintPreviewControl1.Document = PrintDocument1
End Sub
End Class
Dim YAZI_ORTA As New StringFormat
YAZI_ORTA.LineAlignment = StringAlignment.Center
YAZI_ORTA.Alignment = StringAlignment.Center
e.Graphics.PageUnit = GraphicsUnit.Millimetere.Graphics.DrawString(TextBox1.Text, New Font("ARIAL", 12, FontStyle.Bold или FontStyle.Italic), Brushes.Red, 105, 30, YAZI_ORTA)