Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Вопрос по ListView


Автор: Solitaire 1.9.2009, 13:13
Здравствуйте.

Есть 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 подгонялся под размер текста?

Автор: GremlinProg 1.9.2009, 13:26
можно попробовать возвращать 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'а

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

Код

case NM_CUSTOMDRAW:
{
    return CDRF_NEWFONT;
}


Если так, то это не работает.

Автор: Solitaire 1.9.2009, 14:31
Решил проблему, устанавливая текст с помощью 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'а.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)