Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: рисование текста Добавлено: 06.11.03 21:34  

Автор вопроса:   Артём Л. | ICQ: 280044491 

есть rectangle, в его рамки нужно корректно врисовать текст через DrawString определенного размера. Например если текст не помещается в width ректангла делать перенос на следующую строчку. Уже долго мучаюсь, работал через MeasureString, но все равно что-то кривовато выходит.

вот что навоял:

const TITLESIZE=10

Dim H, W, X, Y As Single

dim FBlockTitle$ = "rjlfgnrjkengheighrygteirbthrebthegt"

Dim TextBrush As Brush = Brushes.Black

Dim txtS As SizeF = G.MeasureString(FBlockTitle, New Font("Arial", TITLESIZE))

Dim rect As Rectangle = GetTitleBound() 'метод возвращает прямоугольник в котрый нужно врисовать текст

Dim lines% = Math.Round((txtS.Width) / (rect.Width) + 0.5) 'сколько получилось линий

If txtS.Width < rect.Width Then lines = 1 'нам нужна хотя бы одна

Dim i%

Try

Dim charSize% = G.MeasureString("a", New Font("Arial", TITLESIZE)).Width 'размер символа, очень узкое место программы

Dim charsInLine% = Math.Round((rect.Width) / charSize + 1) 'кол-во символов в строке

'проверка, не вылизли ли мы за пределы

If lines > (rect.Height) / G.MeasureString("a", New Font("Arial", TITLESIZE)).Height Then

lines = (rect.Height) / G.MeasureString("a", New Font("Arial", TITLESIZE)).Height

End If

'координаты

Dim txtX, txtY As Single

txtX = rect.X

txtY = rect.Y

Dim StartIndex% = 0

Dim EndIndex%

'ну а теперь построчный вывод

For i = 0 To lines - 1

If FBlockTitle.Substring(StartIndex).Length < charsInLine Then

EndIndex = FBlockTitle.Substring(StartIndex).Length

Else

EndIndex = charsInLine

End If

txtY = txtS.Height * i + rect.Y

G.DrawString(FBlockTitle.Substring(StartIndex, EndIndex), New Font("Arial", TITLESIZE), TextBrush, txtX, txtY)

StartIndex += charsInLine

Next

Catch ex As Exception

'arm_FactoryUse.Utils.DumpError(ex)

End Try

Ответить

  Ответы Всего ответов: 1  

Номер ответа: 1
Автор ответа:
 grayk



Вопросов: 5
Ответов: 100
 Профиль | | #1 Добавлено: 07.11.03 15:04
Тут как-то много всего, не люблю даже в своем коде копаться... Узкое место - действительно узкое, если пытаться мерять ширину строки целыми числами - тогда криво выходит, а функция MeasureString возвращает между тем тип SizeF. Насколько я помню, собака именно тут порылась. А для вписывания текста в прямоугольник есть готовые средства - метод DrawString(String, Font, Brush, RectangleF). Он вполне корректно работает согласно переданным параметрам. Читай MSDN! (ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfsystemdrawinggraphicsclassdrawstringtopic2.htm)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам