Alfun
Зарегистрирован: 16.12.2007 Сообщения: 11
|
Добавлено: Сб Май 02 2009 14:05 Заголовок сообщения: VB.net проблема переопределения метода OnPaint, помогите плз |
|
|
Кроче народ, возьникла проблема при создании нестандартного эл. управления.
Для его создания я использовал стандартные рекомендации - наследовал от System.Windows.Forms.Control. Переопределил метод OnPaint, и дальше использовал ветку System.Drawing
На данном этапе, для тестирования, нарисовал закрашенный прямоугольник с границами.
Следующим этапом надо сделать так что бы в данном прямоугольнике отображался текст. И тут появилась проблема.
Сам текст отобразить не сложно, это делается инструкцией:
Цитата: |
Dim grfGraphics As System.Drawing.Graphics
grfGraphics = e.Graphics << Где e - это объект класса System.Windows.Forms.PaintEventArgs, передаваемый в метод OnPaint, используется в моем коде потому что напрямую объект класса Graphics создать нельзя.>>
Dim xCoord As Single
Dim yCoord As Single
Dim bshBrush As System.Drawing.Brush
bshBrush = New System.Drawing.SolidBrush(System.Drawing.Color.Black)
xCoord = <<Какое то значение>>
yCoord = <<Какое то значение>>
grfGraphics.DrawString(Me.Text, Me.Font, bshBrush, xCoord, yCoord)
|
По ходу дела необходимо реализовать позиционирование текста внутри элемента управления (например MiddleCenter, или остальные восемь стандартных позиций)
Элемент управления может быть произвольных размеров и текст может быть произвольной длинны, однако xCoord и yCoord задают координаты левого, верхнего угла текстового поля.
Соответственно необходимо каким то образом вычислять координаты верхнего левого угла, для каждой позиции, при произвольном размере текстового поля и самого элемента управления.
Сами вычисления для прямоугольного элемента управления довольно просты (в примере вычисляем позицию MiddleCenter) - необходимо от половины ширины элемента управления, отнять половину ширины текстового поля, и это и будет xCoord.
Проведя такую же операцию с длинной получим yCoord.
Размеры элемента управления получить не сложно, они содержатся в
<<CntrName>>.Size.Width
<<CntrName>>.Size.Height
Так же не сложно получить высоту текстового поля, она зависит от размера шрифта и содержится в Me.Font.Height который мы использовали для создания строки
Проблема заключается в получении ширины текстового поля, я хз как это сделать - я могу получить только количество символов строки, но очевидно что не все буквы одинаковы по ширине..
Хелп плз, подскажите - как получить ширину строки, или каким еще образом можно реализовать позиционирование текста в элементе управления? |
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Вт Май 05 2009 14:40 Заголовок сообщения: Re: VB.net проблема переопределения метода OnPaint, помогите плз |
|
|
Alfun писал(а): | как получить ширину строки, или каким еще образом можно реализовать позиционирование текста в элементе управления? | вар. 1. функция fontmetric() среди разных характеристик шрифтов выдаёт среднюю ширину символа в пикселях. умножив этот число на количество символов в строке, получим приблизительную ширину строки в пикселях (этим способом, видимо, пользуется сама M$, поэтому у неё часто крайние буквы или обрезаются, или вылезают за пределы отведённого поля)
вар. 2. вычислять ширину каждого символа в строке -- тут также потребуется fontmetric() и, наверное, ещё sysmetric() -- и просуммировать их. разумеется, нужно также учесть межсимвольный интервал, который зависит от сочетания символов (то есть выполнить кернинг, причём по алгоритму M$'а)
--------------------------------------
не доверять разработчику -- это неправильно,
не доверять микрософту -- наоборот |
|