Прикольная штука получается с помощью
MeasureCharacterRanges я могу получить регион, описывающий некий участок текста, из региона с помощью функции
GetRegionScans могу получить прямоугольники, составляющие регион и описывающие блоки участка текста, но знаете, что я НЕ могу? Смешно получается, если попытаться эти блоки текста вывести с помощью
DrawString, указав в качестве рабочей области наши прямоугольники из региона, то выходит что некоторые блоки текста тупо в них не влезают, и естественно не выводятся :shock: скажите мне это как так?
Пример (в примере не удаеться отобразить одну строку, так как высота прямоугольника по каким-то своим пречинам на еденицу меньше чем нужно):
- Код: Выделить всё
Private Sub TestForm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim TestString As String = "Visual Basic имеет много новых и улучшенных возможностей языка, " & _
"которые делают его мощным языком объектно-ориентированного " & _
"программирования. Эти возможности включают наследование, " & _
"интерфейсы и перегрузку. Разработчик Visual Basic может " & _
"теперь создавать действительные многопоточные приложения. " & _
"Среди других новых языковых возможностей Visual Basic 2008 " & _
"включает структурированную обработку исключений, настраиваемые " & _
"атрибуты и совместимость спецификации CLS."
Dim DrawFont As New Font("Tahoma", 8.0F)
Dim LayoutArea As New RectangleF(0, 0, 200, 300)
Dim ChrRngs(0) As CharacterRange
ChrRngs(0) = New CharacterRange(0, TestString.Length)
Dim StrFrm As StringFormat = StringFormat.GenericTypographic
StrFrm.FormatFlags = StringFormatFlags.LineLimit Or StringFormatFlags.MeasureTrailingSpaces
StrFrm.SetMeasurableCharacterRanges(ChrRngs)
With e.Graphics
.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
.DrawString(TestString, DrawFont, Brushes.Black, LayoutArea, StrFrm)
Dim TextRegion As Region = .MeasureCharacterRanges(TestString, DrawFont, LayoutArea, StrFrm)(0)
.FillRegion(New SolidBrush(Color.FromArgb(50, Color.Red)), TextRegion)
.TranslateTransform(220, 0)
Dim Rects() As RectangleF = TextRegion.GetRegionScans(New Drawing2D.Matrix)
Dim i As Integer = 0
Dim Count As Integer = 0
For i = 0 To Rects.Length - 1
Debug.Print(Rects(i).ToString)
.MeasureString(TestString, DrawFont, Rects(i).Size, StrFrm, Count, Nothing)
.DrawString(Strings.Left(TestString, Count), DrawFont, Brushes.Black, Rects(i), StrFrm)
TestString = TestString.Substring(Count)
Next
End With
End Sub
Лично я такого поведения не понимаю.
Может кто-то предложит свой вариант? Нужна
НЕБОЛЬШАЯ процедура, которая будет
ПРАВИЛЬНО, т.е. с нормальным переносом строк, выводить текст в определенную область и выделять другим цветом ссылки и только. Нужно для программы Stickers. Могу положить свой вариант, построенный по вышеуказанному принципу, хотя он и подсвечивает ссылки и даже они клюкаются, но как я уже описал текст иногда местами не выводиться.