Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

VB.net проблема переопределения метода OnPaint, помогите плз

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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$'а)
--------------------------------------
не доверять разработчику -- это неправильно,
не доверять микрософту -- наоборот
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...