Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать Label.Width 
V
    Опции темы
vponomarov
Дата 24.3.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 5
Всего: 12



Подскажите как узнать ширину лэйбла необходимую для того, чтобы в него полностью поместился заданный текст.
Graphics.MeasureString() дает неточные результаты и текст часто обрезается.


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Kefir
Дата 24.3.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



Graphics.MeasureString() даёт очень даже точные числа. Может, ты забыл учесть Margin или Padding в своих вычислениях?.. А ещё у лейбла есть AutoSize = true  smile (может ты просто не заметил? В))
PM MAIL WWW Skype   Вверх
vponomarov
Дата 24.3.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 5
Всего: 12



Margin и Padding равны 0.
Автосайз мне не подходит, нужно вручную просчитывать...

Это сообщение отредактировал(а) vponomarov - 24.3.2008, 16:13


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Kefir
Дата 24.3.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



а можно тогда пример неточного измерения? а то я не видел чтобы оно неточно мерило.
PM MAIL WWW Skype   Вверх
vponomarov
Дата 24.3.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 5
Всего: 12



Цитата

а можно тогда пример неточного измерения?

без проблем:
Код

this.label2.Location = new System.Drawing.Point(3, 175);
            this.label2.Margin = new System.Windows.Forms.Padding(0);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(314, 13);
            this.label2.TabIndex = 5;
            this.label2.Text = "no media to play... dsnfjksd fjsdh fjsd hfjsd hfjksd hfjkds hfj";
            this.label2.Click += new System.EventHandler(this.label2_Click);

//-------------------------------------------------------------------------------

private void label2_Click(object sender, EventArgs e)
        {
            Graphics g = label2.CreateGraphics();
            float w = g.MeasureString(label2.Text, label2.Font).Width;
        }



w=296, а чтобы поместилась все строка должно быть миниму 316...


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Dogo
Дата 24.3.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 9



Хм а у меня высчитывает длину чуть большею чем нужно...
Вылечил вот так:
Код

float w = g.MeasureString(label1.Text, label1.Font, PointF.Empty, StringFormat.GenericTypographic).Width;

--------------------
 
PM MAIL ICQ   Вверх
vponomarov
Дата 24.3.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 5
Всего: 12



Dogo, на тестовом примере (см. пост выше) все равно дает меньший результат - 284 вместо нужных 316:(


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Dogo
Дата 24.3.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 9



Да у меня тоже "284". Точнее "283.5454". А разве этого не достаточно?
Померил Photoshop'ом, достаточно 280px.

user posted image
--------------------
 
PM MAIL ICQ   Вверх
Optimus
Дата 24.3.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 1.9.2007

Репутация: 2
Всего: 14



Цитата(vponomarov @  24.3.2008,  16:36 Найти цитируемый пост)
а чтобы поместилась все строка должно быть миниму 316... 

Можно узнать как вы это вычислили ?

Цитата(vponomarov @  24.3.2008,  16:36 Найти цитируемый пост)
label2.Font

Можно посмотреть что за Font.
--------------------
"постановка задачи наполовину решает саму задачу"
PM MAIL   Вверх
vponomarov
Дата 24.3.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 5
Всего: 12



Dogo, в том-то и прикол, что сам текст занимает 283.5454 пикселя, но при выводе его через лэйбл - этого не достаточно и он обрезает текст
при чем не просто то, что не помещается, а все последнее слово (даже если не поместится всего один пиксель:( )

Цитата

Можно узнать как вы это вычислили ?

label2.PreferedWidth

Цитата

Можно посмотреть что за Font. 

this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Dogo
Дата 24.3.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 9



vponomarov, у вас в строчке, которую хотите показать в label'е, случайно в конце нет пробельных символов?
А как видно из примера и иллюстрации рассчитанного с помощью MeasureString() пространства более чем достаточно для вывода строки...

PS. Странно, но при использовании ваших условий
Цитата(vponomarov @  25.3.2008,  00:24 Найти цитируемый пост)
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 
Цитата(vponomarov @  24.3.2008,  17:36 Найти цитируемый пост)
this.label2.Text = "no media to play... dsnfjksd fjsdh fjsd hfjsd hfjksd hfjkds hfj";
PreferedWidth равно ровно 280, что соответсвует иллюстрации...

--------------------
 
PM MAIL ICQ   Вверх
Kefir
Дата 24.3.2008, 23:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



vponomarov, в общем всё ясно. я наконец-то догнал что к чему. Label юзает другой метод для отрисовки текста, нежели чем банальный Graphics.MeasureString. оно юзает TextRenderer.MeasureText (уж и не знаю почему - в рефлекторе подглядел). Посему вместо

Код

            Graphics g = label2.CreateGraphics();
            float w = g.MeasureString(label2.Text, label2.Font).Width;

просто напишите
Код

float w = TextRenderer.MeasureText(label2.Text, label2.Font).Width;

и сразу получается 280, что и есть реальный размер строки.

Это сообщение отредактировал(а) Kefir - 24.3.2008, 23:56
PM MAIL WWW Skype   Вверх
Dogo
Дата 25.3.2008, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 9



Можно вообще проще поступить 
Код

label2.Width = label2.PreferedWidth

--------------------
 
PM MAIL ICQ   Вверх
altarvic
Дата 25.3.2008, 07:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 2.3.2007

Репутация: нет
Всего: 1



TextRenderer использует GDI для отрисовки текста, а Graphics.DrawString() - GDI+
Как ни странно, но качество отрисовки текста выше у GDI, поэтому был введен метод SetCompatibleTextRendering (у Application) и у Label'а есть свойство UseCompatibleTextRendering
и если посмотреть метод OnPaint(PaintEventArgs e) у Label'а, то видно что там отрисовка зависит от 
UseCompatibleTextRendering.


Это сообщение отредактировал(а) altarvic - 25.3.2008, 07:45
PM MAIL   Вверх
vponomarov
Дата 25.3.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 5
Всего: 12



Kefir, вот это реально дельный совет!
респект и уважуха smile 
спасибо!


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.