Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка в CListCtrl, Нажатием на хидер колонки 
:(
    Опции темы
kometa_triatlon
Дата 2.6.2005, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

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



Часто встречается такая фишка: рядом с названием одной из колонок CListCtrl ( стиль report ) есть небольшой треугольник. Нажатие на хидер устанавливает сортировку списка по этому полю, повторное нажатие меняет направление сортировки. Ну вы поняли о чем я. Как это сделать? Есть стандартные функции или нужно ловить событие нажатия на заголовок и писать свою функцию сортировки? Может есть у кого пример кода?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
kometa_triatlon
Дата 2.6.2005, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

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



Кое-что нашел в rsdn... Но остается два вопроса. Как узнать, на хидер какого столбца нажали? И как вывести треугольник?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Lion
Дата 2.6.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вкратце:
1. Обрабатывается сообщение LVN_COLUMNCLICK списка. Там приходит структура, в которой есть индекс столбца.
2. Значок рисуешь сам , подставляя изображение с прозрачным фоном в CHeaderCtrl списка.
3. Еще надо написать CALLBACK функции сравнения строк списка.

Код есть, но он в проекте. Пример могу написать, к вечеру. Если сильно надо, обращайтесь. smile

Это сообщение отредактировал(а) Lion - 3.6.2005, 06:47
PM MAIL   Вверх
kometa_triatlon
Дата 2.6.2005, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

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



Сильно надо!!! Первый раз работаю с CListCtrl, нужен пример.
Ну план понятен, но реализовать я его не смогу smile
Цитата
. Обрабатывается сообщение LVN_COLUMNCLICK списка. Там приходит структура, в которой есть индекс столбца

Название поля узнаю методом тыка smile
Цитата
Значок рисуешь сам , привязывая список изображений с прозрачным фоном к CHeaderCtrl списка и устанавливая соответствующий значок.

А вот здесь не понял. Точнее понял, но не знаю как сделать...



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Lion
Дата 2.6.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Завтра с утра.
PM MAIL   Вверх
kometa_triatlon
Дата 2.6.2005, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

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



smile
Завтра с утра я уже сдам прогу...
Ну все равно, хоть научусь.


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
St. Andrew
Дата 3.6.2005, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



kometa_triatlon, а можешь примерчик выложить? А то мы сегодня полдня пытались заставить работать CListCtrl и ничего в него толком не вывелось... smile Примерчик будет очень и очень кстати! smile Если нетрудно, можешь на мыло бросить программку?
--------------------
Оглянитесь вокруг! В мире так много прекрасного!
PM MAIL WWW ICQ   Вверх
Lion
Дата 3.6.2005, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(kometa_triatlon @ 2.6.2005, 20:45)
smile
Завтра с утра я уже сдам прогу...
Ну все равно, хоть научусь.

Ну блин Семен Семеныч, где ж ты раньше был.smile Сказал бы что надо к такому-то. Я бы вчера еще написал. smile


Файл прилагаю. Там в общем не все так просто. smile

P.S. Код сильно не пинать.


Присоединённый файл ( Кол-во скачиваний: 88 )
Присоединённый файл  Sort.zip
PM MAIL   Вверх
kometa_triatlon
Дата 3.6.2005, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

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



St. Andrew
Нетрудно smile


Lion
Ну ты все равно успел smile, сейчас буду дуплить smile


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Lion
Дата 3.6.2005, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(kometa_triatlon @ 3.6.2005, 03:47)
Lion
Ну ты все равно успел smile, сейчас буду дуплить smile

Буду следить за форумом, если что не понятно пиши (можешь прям с кусками кода).
PM MAIL   Вверх
kometa_triatlon
Дата 3.6.2005, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

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



Мыло только что отправил, пример посмотрел, понравилось smile
Всем спасибо smile


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
St. Andrew
Дата 3.6.2005, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



kometa_triatlon, Большое спасибо! smile
--------------------
Оглянитесь вокруг! В мире так много прекрасного!
PM MAIL WWW ICQ   Вверх
kometa_triatlon
Дата 4.6.2005, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

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



Самое грустное, это то, что у меня это код не заработал smile
Пример работает нормально, но как только перенес код, сортировка кончилась smile
Следствие показало, что проблема здесь:
Код

str1=pView->m_listList.GetItemText(nIndex, 0);
    // Вторая строка
    FindInfo.lParam=lParam2;
    nIndex=nIndex=pView->m_listList.FindItem(&FindInfo);
    
    str2=pView->m_listList.GetItemText(nIndex, 0);

Обе строки принимают одно значение (если конкретнее - текст первого элемента списка)
Не понимаю... smile
Код

.....
typedef struct tagStructInfoType
{
    UINT    nCol;
    UINT    nCode;
} StructInfoType;

#define    SORT_ASC    0
#define    SORT_DESC    1

......


void Clab8View::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    *pResult = 0;

    CHeaderCtrl    *pHdr=m_listList.GetHeaderCtrl();
    HDITEM    HdrItem;
    HdrItem.mask=HDI_FORMAT;
    HdrItem.fmt=HDF_STRING;
    
    pHdr->SetItem(m_SortInfo.nCol, &HdrItem);
    
    if(m_SortInfo.nCol!=(UINT)pNMLV ->iSubItem)
    {
        m_SortInfo.nCol=(UINT)pNMLV ->iSubItem;
        m_SortInfo.nCode=SORT_ASC;
        Sort();
        return;
    }
    else
    {
        if(m_SortInfo.nCode==SORT_ASC)
        {
            m_SortInfo.nCode=SORT_DESC;
            Sort();
            return;
        }
        if(m_SortInfo.nCode==SORT_DESC)
        {
            m_SortInfo.nCode=SORT_ASC;
            Sort();
            return;
        }
    }
}

void Clab8View::Sort(void)
{

    CWaitCursor    Wait;
    // Заголовок
    CHeaderCtrl    *pHdr=m_listList.GetHeaderCtrl();
    HDITEM    HdrItem;
    HdrItem.mask=HDI_BITMAP|HDI_FORMAT;
    HdrItem.fmt=HDF_STRING|HDF_BITMAP|HDF_BITMAP_ON_RIGHT;
    if(m_SortInfo.nCode==SORT_ASC)
    {
        HdrItem.hbm=m_bmpSortUpArrow;
    }
    else
    {
        HdrItem.hbm=m_bmpSortDownArrow;
    }
    
        // Сортировка по строке
        m_listList.SortItems(SortStr, (LPARAM)this);
        HdrItem.fmt|=HDF_LEFT;
    

    pHdr->SetItem(m_SortInfo.nCol, &HdrItem);
}

int CALLBACK Clab8View::SortStr(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    CString    str1, str2;
    LVFINDINFO    FindInfo;
    memset(&FindInfo, 0, sizeof(LVFINDINFO));
    FindInfo.flags=LVFI_PARAM;
    // Первая строка
    FindInfo.lParam=lParam1;
    Clab8View* pView = (Clab8View*)lParamSort;
    int    nIndex=pView->m_listList.FindItem(&FindInfo);
    //int num = pView->m_SortInfo.
    str1=pView->m_listList.GetItemText(nIndex, 0);
    // Вторая строка
    FindInfo.lParam=lParam2;
    nIndex=nIndex=pView->m_listList.FindItem(&FindInfo);
    
    str2=pView->m_listList.GetItemText(nIndex, 0);
    // Сравниваем строки
    TRACE(str1);
    TRACE(str2);
    if(pView->m_SortInfo.nCode==SORT_ASC)
    {
        return strcmp(str1, str2);
    }
    if(pView->m_SortInfo.nCode==SORT_DESC)
    {
        return (-1*strcmp(str1, str2));
    }
    return 0;
    
}



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Lion
Дата 6.6.2005, 04:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сори был в offline.

Ты при заполнении списка делаешь SetItemData(…)? Если нет, то у тебя для всех Item в функцию сортировки приходят нули, автоматически подставленные при добавлении Item-ов. smile Нужно каждому Item сопоставить функцией SetItemData(…) уникальный индекс, чтобы ты мог его потом найти в функции сортировки.

Посмотри функцию FillList() в примере.



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


 




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


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

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