Здравствуйте 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]: Проблема с подсчетом длины строки листконтрола
AW>Проблема в чем: длина посчитывается неправильно
Известная трабла...GetTextExtent выдает неточные значения.
Имхо, тебе поможет CListCtrl::SetColumnWidth(nCol, LVSCW_AUTOSIZE),
если нет, то смотри сюда
Здравствуйте KaSA, Вы писали:
KSA>Здравствуйте Alexandr_wolf, Вы писали:
KSA> AW>>Проблема в чем: длина посчитывается неправильно
KSA>Известная трабла...GetTextExtent выдает неточные значения. KSA>Имхо, тебе поможет CListCtrl::SetColumnWidth(nCol, LVSCW_AUTOSIZE), KSA>если нет, то смотри сюда
AW>Не работает! AW>проблема в том, что в функции GetTextBoundingRect() iNumPts = GetPath(hDC, NULL, NULL, 0) возвращает ноль. И ректангл не заполняется.
AW>LVSCW_AUTOSIZE тоже не работает...
А что настолько большая погрешность? Шрифт хитрый юзаешь?
Ширину каждого символа можно выдернуть прямо из ttf'а. Правда при этом не учитываются межбуквенные интервалы.
Почетный кавалер ордена Совка.
Re[5]: Проблема с подсчетом длины строки листконтрола
Здравствуйте Patalog, Вы писали:
P>Здравствуйте Alexandr_wolf, Вы писали:
P>[]
KSA>>>Известная трабла...GetTextExtent выдает неточные значения. KSA>>>Имхо, тебе поможет CListCtrl::SetColumnWidth(nCol, LVSCW_AUTOSIZE), KSA>>>если нет, то смотри сюда
AW>>Не работает! AW>>проблема в том, что в функции GetTextBoundingRect() iNumPts = GetPath(hDC, NULL, NULL, 0) возвращает ноль. И ректангл не заполняется.
AW>>LVSCW_AUTOSIZE тоже не работает...
P>А что настолько большая погрешность? Шрифт хитрый юзаешь? P>Ширину каждого символа можно выдернуть прямо из ttf'а. Правда при этом не учитываются межбуквенные интервалы.
Да вроде обычные шрифты... Просто мне надо по размеру текста итема в листконтроле изменять размер диалога... Почему iNumPts равно нулю, не понимаю...
Re[6]: Проблема с подсчетом длины строки листконтрола
[]
P>>А что настолько большая погрешность? Шрифт хитрый юзаешь? P>>Ширину каждого символа можно выдернуть прямо из ttf'а. Правда при этом не учитываются межбуквенные интервалы.
AW>Да вроде обычные шрифты... Просто мне надо по размеру текста итема в листконтроле изменять размер диалога... Почему iNumPts равно нулю, не понимаю...
GetLastError что говорит?
Почетный кавалер ордена Совка.
Re[6]: Проблема с подсчетом длины строки листконтрола
Здравствуйте 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: Проблема с подсчетом длины строки листконтрола
Здравствуйте 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>Проблема с подсчетом длины строки листконтрола