Страница: 1 |
есть 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 |
Вопрос: рисование текста
Добавлено: 06.11.03 21:34
Автор вопроса: Артём Л. | ICQ: 280044491
Ответы
Всего ответов: 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)