Проблема с подсчетом длины строки листконтрола
От: Alexandr_wolf Россия http://secure.dinfo.ru
Дата: 09.11.02 20:51
Оценка:
Задача: надо посчитать максимальную длинну (в пикселях) текста для итема листконтрола.(Надо изменять размер колонки, чтобы весь текст влезал) Пишу:

CDC* pDC = m_list.GetDC();
for (int i = 0;i<m_list.GetItemCount();i++)
{
CString str = ((LAYER*)m_list.GetItemData(i))->name;
int len = pDC->GetTextExtent(str).cx;
if (MaxLen < len)
MaxLen = len;
}

m_list.SetColumnWidth(0,MaxLen);
Проблема с подсчетом длины строки листконтрола
Re: Проблема с подсчетом длины строки листконтрола
От: Alexandr_wolf Россия http://secure.dinfo.ru
Дата: 09.11.02 20:58
Оценка:
Здравствуйте Alexandr_wolf, Вы писали:

AW>Задача: надо посчитать максимальную длинну (в пикселях) текста для итема листконтрола.(Надо изменять размер колонки, чтобы весь текст влезал) Пишу:


AW>CDC* pDC = m_list.GetDC();

AW>for (int i = 0;i<m_list.GetItemCount();i++)
AW>{
AW> CString str = ((LAYER*)m_list.GetItemData(i))->name;
AW> int len = pDC->GetTextExtent(str).cx;
AW> if (MaxLen < len)
AW> MaxLen = len;
AW>}

AW>m_list.SetColumnWidth(0,MaxLen);

AW>Проблема с подсчетом длины строки листконтрол

Проблема в чем: длина посчитывается неправильно
Re[2]: Проблема с подсчетом длины строки листконтрола
От: KaSA  
Дата: 10.11.02 01:21
Оценка:
Здравствуйте Alexandr_wolf, Вы писали:


AW>Проблема в чем: длина посчитывается неправильно


Известная трабла...GetTextExtent выдает неточные значения.
Имхо, тебе поможет CListCtrl::SetColumnWidth(nCol, LVSCW_AUTOSIZE),
если нет, то смотри сюда
Автор: Dutchman
Дата: 11.04.02
Re[3]: Проблема с подсчетом длины строки листконтрола
От: Alexandr_wolf Россия http://secure.dinfo.ru
Дата: 10.11.02 07:49
Оценка:
Здравствуйте KaSA, Вы писали:

KSA>Здравствуйте Alexandr_wolf, Вы писали:


KSA>

AW>>Проблема в чем: длина посчитывается неправильно

KSA>Известная трабла...GetTextExtent выдает неточные значения.

KSA>Имхо, тебе поможет CListCtrl::SetColumnWidth(nCol, LVSCW_AUTOSIZE),
KSA>если нет, то смотри сюда
Автор: Dutchman
Дата: 11.04.02


Не работает!
проблема в том, что в функции GetTextBoundingRect() iNumPts = GetPath(hDC, NULL, NULL, 0) возвращает ноль. И ректангл не заполняется.

LVSCW_AUTOSIZE тоже не работает...
Re[4]: Проблема с подсчетом длины строки листконтрола
От: Patalog Россия  
Дата: 10.11.02 07:59
Оценка:
Здравствуйте Alexandr_wolf, Вы писали:

[]

KSA>>Известная трабла...GetTextExtent выдает неточные значения.

KSA>>Имхо, тебе поможет CListCtrl::SetColumnWidth(nCol, LVSCW_AUTOSIZE),
KSA>>если нет, то смотри сюда
Автор: Dutchman
Дата: 11.04.02


AW>Не работает!

AW>проблема в том, что в функции GetTextBoundingRect() iNumPts = GetPath(hDC, NULL, NULL, 0) возвращает ноль. И ректангл не заполняется.

AW>LVSCW_AUTOSIZE тоже не работает...


А что настолько большая погрешность? Шрифт хитрый юзаешь?
Ширину каждого символа можно выдернуть прямо из ttf'а. Правда при этом не учитываются межбуквенные интервалы.
Почетный кавалер ордена Совка.
Re[5]: Проблема с подсчетом длины строки листконтрола
От: Alexandr_wolf Россия http://secure.dinfo.ru
Дата: 10.11.02 08:21
Оценка:
Здравствуйте Patalog, Вы писали:

P>Здравствуйте Alexandr_wolf, Вы писали:


P>[]


KSA>>>Известная трабла...GetTextExtent выдает неточные значения.

KSA>>>Имхо, тебе поможет CListCtrl::SetColumnWidth(nCol, LVSCW_AUTOSIZE),
KSA>>>если нет, то смотри сюда
Автор: Dutchman
Дата: 11.04.02


AW>>Не работает!

AW>>проблема в том, что в функции GetTextBoundingRect() iNumPts = GetPath(hDC, NULL, NULL, 0) возвращает ноль. И ректангл не заполняется.

AW>>LVSCW_AUTOSIZE тоже не работает...


P>А что настолько большая погрешность? Шрифт хитрый юзаешь?

P>Ширину каждого символа можно выдернуть прямо из ttf'а. Правда при этом не учитываются межбуквенные интервалы.

Да вроде обычные шрифты... Просто мне надо по размеру текста итема в листконтроле изменять размер диалога... Почему iNumPts равно нулю, не понимаю...
Re[6]: Проблема с подсчетом длины строки листконтрола
От: Patalog Россия  
Дата: 10.11.02 08:28
Оценка:
Здравствуйте Alexandr_wolf, Вы писали:

[]

P>>А что настолько большая погрешность? Шрифт хитрый юзаешь?

P>>Ширину каждого символа можно выдернуть прямо из ttf'а. Правда при этом не учитываются межбуквенные интервалы.

AW>Да вроде обычные шрифты... Просто мне надо по размеру текста итема в листконтроле изменять размер диалога... Почему iNumPts равно нулю, не понимаю...


GetLastError что говорит?
Почетный кавалер ордена Совка.
Re[6]: Проблема с подсчетом длины строки листконтрола
От: Patalog Россия  
Дата: 10.11.02 08:38
Оценка:
Здравствуйте Alexandr_wolf, Вы писали:
[]

AW>Да вроде обычные шрифты... Просто мне надо по размеру текста итема в листконтроле изменять размер диалога... Почему iNumPts равно нулю, не понимаю...


Что-нить типа
CClientDC dc(this);
CFont* font = CFont::FromHandle(reinterpret_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT)));
CFont* old_font = dc.SelectObject(font);

не пробовал? А потом уже BeginPath...
Почетный кавалер ордена Совка.
Re: Проблема с подсчетом длины строки листконтрола
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.11.02 09:32
Оценка:
Здравствуйте Alexandr_wolf, Вы писали:

AW>Задача: надо посчитать максимальную длинну (в пикселях) текста для итема листконтрола.(Надо изменять размер колонки, чтобы весь текст влезал) Пишу:


AW>CDC* pDC = m_list.GetDC();
AW>for (int i = 0;i<m_list.GetItemCount();i++)
AW>{
AW>    CString str = ((LAYER*)m_list.GetItemData(i))->name;
AW>    int len = pDC->GetTextExtent(str).cx;
AW>    if (MaxLen < len)
AW>        MaxLen = len;
AW>}


AW>m_list.SetColumnWidth(0,MaxLen);

AW>Проблема с подсчетом длины строки листконтрола

А к чему здесь CDC? Почему не просто

int len = m_list.GetStringWidth(str);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.