Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CListBox и SetHorizontalExtent(), не работает метод? 
V
    Опции темы
takedo
Дата 1.3.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Создал класс, производный от CListBox. Создаю его так:
Create(WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|LBS_OWNERDRAWFIXED,CRect(0,0,10,10),this,IDM_LISTBOX);

Дальше так:

Код

void MListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{


   CSize   sz;
   CDC*    pDC = GetDC();
   CFont* f;
   f = GetFont();
   int sdc = pDC->SaveDC();
   pDC->SelectObject(f);
   CString str = _T("ЩЩЩЩЩЩЩЩЩЩ");
   sz = pDC->GetTextExtent(str);
   pDC->RestoreDC(sdc);
   ReleaseDC(pDC);
   lpMeasureItemStruct->CtlType = ODT_LISTBOX;
   lpMeasureItemStruct->itemHeight = 12*sz.cy/10;
   lpMeasureItemStruct->itemWidth = sz.cx*MaxChar;
   SetHorizontalExtent(sz.cx*MaxChar/str.GetLength()
}

Так вот сколько бы я не устанавливал в значении SetHorizontalExtent(хоть 10 хоть 10000) - результат тот же!!!! А именно, поле в котором выводится текст(список) всегда по моему одинакового горизонтального размера, и оно прокручивается с помощью горизонтальной прокрутки несмотря на то, какой размер задается в SetHorizontalExtent, даже когда текст с размером MaxChar полностью влазит в видимую часть этого поля. А прокручивать получается так далеко, что вообще все надписи могут исчезнуть.
Здесь sz.cx/str.GetCount() - ширина одного символа, пока так (у меня есть конечно текст самой длинной надписи), в общем не это главное.
Помогите сделать так, чтобы прокрутка осуществлялась только до конца моей самой длинной строки, плиз.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
redpinguin
Дата 1.3.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Допиши в класс лист бокса
2 функции

Код


int CMyListBox::GetTextLen(LPCTSTR lpszText)
{
    ASSERT(AfxIsValidString(lpszText));

    CDC *pDC = GetDC();
    ASSERT(pDC);

    CSize size;
    CFont* pOldFont = pDC->SelectObject(GetFont());
    if ((GetStyle() & LBS_USETABSTOPS) == 0)
    {
        size = pDC->GetTextExtent(lpszText, (int) _tcslen(lpszText));
        size.cx += 21;
    }
    else
    {
        size = pDC->GetTabbedTextExtent(lpszText, (int) _tcslen(lpszText), 0, NULL);
        size.cx += 20;
    }
    pDC->SelectObject(pOldFont);
    ReleaseDC(pDC);

    return size.cx;
}




Код


void CMyListBox::SetNewHExtent(LPCTSTR lpszNewString)
{
    int iExt = GetTextLen(lpszNewString);
    if (iExt > GetHorizontalExtent())
        SetHorizontalExtent(iExt);
}



и перегрузи AddString

Код

int CMyListBox::AddString(LPCTSTR lpszItem)
{
   ...
   SetNewHExtent(lpszItem);
   ...
}



Код

void CMyListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
    lpMeasureItemStruct->itemHeight +=24;
}



размеры сам подставь у меня с иконками был класс так что там везде +20 и больше
PM MAIL   Вверх
takedo
Дата 1.3.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



redpinguin, Вообщем добалил я в AddString SetHorizontalExtent() и заработало, видимо надо хоть раз оттуда было вызвать! Не понял правдо что за зверь GetTabbedTextExtent()?
Спасибо. smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 2.3.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(takedo @ 1.3.2006, 15:29 Найти цитируемый пост)
что за зверь GetTabbedTextExtent()?

Эта функция возвращает размер (ширину, высоту) заданной строки в соответствии со шрифтом, установленным в контексте, и с учетом табуляций.


--------------------
...
PM   Вверх
takedo
Дата 3.3.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Earnest,
мда, скорее всего с моими познаниями в аглицком до конца с параметрами "зверя" не разбирусь, но вот что у меня получилось:
CPaintDC dc(this); // device context for painting

Код

        CString str;
        CSize s1,s2;
        str = _T("Просто текст с \tтабуляцией");
        s1 = dc.GetTextExtent(str);
        s2 = dc.GetTabbedTextExtent(str,0,0);
        //s1.cx = 191
        //s2.cx = 205;
        CDialog::OnPaint();

Однако..., стоит наверное использовать только GetTabbedTextExtent. smile
Добавлено @ 13:40
CPaintDC dc(this); // device context for painting
это в коде smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 4.3.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Два оставшихся параметра - это число позиций табуляции и массив позиций.
Чтобы все правильно считалось, нужно чтобы позиции табуляций совпадали с теми, которые установлены в листбоксе. Если ты сам ничего не устанавливал листбоксу, то скорее всего, все совпадает. Но если захочешь установить листбоксу другие позиции - придется и здесь их передавать.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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