Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по ListView, Изменение текста элемента в icon view 
V
    Опции темы
Solitaire
Дата 1.9.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.

Есть List View, в котором пользователь может изменить текст элемента.
Код

m_hListView = ::CreateWindow( WC_LISTVIEW, _T(""),
    WS_CHILD | WS_VISIBLE | WS_BORDER |
    LVS_ICON | LVS_AUTOARRANGE | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | LVS_EDITLABELS,
    0, 0, 0, 0,  hParentWindow, (HMENU)ID, ::GetModuleHandle( 0 ), NULL );


Код

case LVN_GETDISPINFO:
{
    pLvdi->item.pszText = itemTextArray.at( pLvdi->item.iItem );
    break;
}
case LVN_ENDLABELEDIT:
{
    if( pLvdi->item.pszText == NULL )
        break;
    _tcscpy_s( itemTextArray.at( pLvdi->item.iItem ), 255, pLvdi->item.pszText );
    break;
}


Проблема в том, что после изменения текста, размер label'а, содержащего текст не изменяется. Например, если текст был короткий (4 символа) и его заменили на длинный (16 символов), то после редактирования в label'е видно только 4 символа (в режиме редактирования видно всю строку). Наоборот, если текст был длинный (16 символов) и его заменили на короткий (4 символа), то после редактирования, когда элемент выделен, видно, что label растянут на 16 символов и в нем короткий текст по центру. Никаких специальных сообщений, управляющих размером label'а я не нашел. Как можно сделать, чтобы label подгонялся под размер текста?
PM MAIL   Вверх
GremlinProg
Дата 1.9.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



можно попробовать возвращать CDRF_NEWFONT в ответ на уведомление NM_CUSTOMDRAW
т.е. чтобы при рисовании, listview всегда учитывал габариты текста sub-item'а

http://msdn.microsoft.com/en-us/library/bb774865(VS.85).aspx

Добавлено через 42 секунды
Цитата(GremlinProg @  1.9.2009,  15:26 Найти цитируемый пост)
sub-item'а

sub-item'а или просто item'а


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Solitaire
Дата 1.9.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



К сожалению я еще не разбирался с NM_CUSTOMDRAW, т.к. до настоящего момента вполне устраивала стандартная прорисовка. Я не совсем понял, что нужно сделать. Просто обработать его вот так?

Код

case NM_CUSTOMDRAW:
{
    return CDRF_NEWFONT;
}


Если так, то это не работает.
PM MAIL   Вверх
Solitaire
Дата 1.9.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Решил проблему, устанавливая текст с помощью ListView_SetItemText.

Код

//case LVN_GETDISPINFO:
//{
//    pLvdi->item.pszText = itemTextArray.at( pLvdi->item.iItem );
//    break;
//}
case LVN_ENDLABELEDIT:
{
    if( pLvdi->item.pszText == NULL )
        break;
    int itemIndex = pLvdi->item.iItem;
    _tcscpy_s( itemTextArray.at( itemIndex ), 255, pLvdi->item.pszText );
    ListView_SetItemText( m_hListView, itemIndex, 0, itemTextArray.at( itemIndex ) ); // <-----
    break;
}


Хотя это странно. Во многих примерах по List View текст, который хранится в каком-то внешнем буфере, устанавливается именно через обработку LVN_GETDISPINFO, и нигде не упоминается о проблемах с размером label'а.
PM MAIL   Вверх
Earnest
Дата 2.9.2009, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Текст запрашивается через LVN_GETDISPINFO только для виртуальных списков. Кроме того, это уведомление посылается и в других случаях, и его нужно правильно обрабатывать - анализировать флаги маски и в зависимости от этого заполнять структуру.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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