Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListView, стиль vsReport, сортировка по столбцу, стрелочка в шапке столбца 
V
    Опции темы
artsb
Дата 11.6.2010, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Всем привет!

Есть ListView со стилем vsReport. Сортировка по столбцу готова. Теперь бы как-нибудь отобразить, как отсортированы данные: по возрастанию или по убыванию. Никаких стандартных средств для решения этой проблемы не нашёл. Остаётся рисовать вручную, но нет события, которое возникает при отрисовке шапки столбца.
Сделал так: использую свойство ImageIndex столбца и в нужный момент, меняю картинку. Но, стрелочка находится слева и пропала подсветка шапки при наведении мышью.

Как можно нарисовать стрелочку в шапке?

Это сообщение отредактировал(а) artsb - 11.6.2010, 09:50


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 11.6.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(artsb @  11.6.2010,  09:42 Найти цитируемый пост)
Никаких стандартных средств для решения этой проблемы не нашёл.

Для операционных систем Windows XP и старше:
Код
#define HDF_SORTDOWN (0x0200)
#define HDF_SORTUP (0x0400)

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HWND hHeader = ListView_GetHeader(ListView1->Handle);
    HDITEM hdi;
    hdi.mask = HDI_FORMAT;
    hdi.fmt = HDF_SORTUP | HDF_STRING;
    //hdi.fmt = HDF_SORTDOWN | HDF_STRING;
    Header_SetItem(hHeader, /*column index*/0, &hdi);
}

Для того, чтобы стрелочка рисовалась, нужно включить визуальные стили Windows XP.
PM   Вверх
nick42
Дата 11.6.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(artsb @ 11.6.2010,  08:42)
... Как можно нарисовать стрелочку в шапке?

Я пробовал переписывать заголовок с добавлением кода стрелки, что-то типа:
 <onColumnClick> 

   char down[2] = {  0xAF, 0  };
   AnsiString  S = down;
    
   ListView1->Columns->Items[Column->Index]->Caption = "Столбец  "+ S ;

   , но для стрелки FontName должен быть "Symbol" (код 0xAF), тогда текст искажается. Если сможете обойти это как-то форматированием строки... .
PM MAIL   Вверх
artsb
Дата 12.6.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



586, спасибо. То что нужно!
Вот только есть вопросы.
Пишу так:
Код

void __fastcall TForm1::ListView1ColumnClick(TObject *Sender, TListColumn *Column)
{
    HWND hHeader = ListView_GetHeader(ListView1->Handle);
    HDITEM hdi;

    // clear
    for(int i=0; i<ListView1->Columns->Count; i++) {
        Header_GetItem(hHeader, i, &hdi);
        if(hdi.fmt & HDF_SORTUP)
            hdi.fmt &= ~HDF_SORTUP;
        else if(hdi.fmt & HDF_SORTDOWN)
            hdi.fmt &= ~HDF_SORTDOWN;
        Header_SetItem(hHeader, i, &hdi);
    }

    // set
    memset(&hdi, 0, sizeof(HDITEM));
    hdi.mask = HDI_FORMAT;
    Column->Tag = !Column->Tag;
    if(Column->Tag)
        hdi.fmt = HDF_SORTUP | HDF_STRING;
    else
        hdi.fmt = HDF_SORTDOWN | HDF_STRING;
    Header_SetItem(hHeader, Column->Index, &hdi);
}

Проблемы:
1. После клика по заголовку, он остаётся подсвеченным даже если компонент теряет фокус. Можно ли как-то вручную убрать подсветку?
2. Почему-то не всегда работает очистка, т.е. сброс стрелочек.


nick42, спасибо, но вариант 586 мне больше нравится ;)


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 12.6.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(artsb @  12.6.2010,  15:53 Найти цитируемый пост)
1. После клика по заголовку, он остаётся подсвеченным даже если компонент теряет фокус.

У меня вроде нормально работает. Пример в аттаче.
Цитата(artsb @  12.6.2010,  15:53 Найти цитируемый пост)
2. Почему-то не всегда работает очистка, т.е. сброс стрелочек.

Пример в аттаче.

Картинку можно тоже нарисовать, причём должно работать на версиях младше Windows XP и без тем. http://www.winapizone.net/tutorials/winapi...mnsortimage.php

Добавлено через 4 минуты и 52 секунды
На странице по ссылке, справа зелёный квадратик, там ссылки на скачивание рисунков-стрелочек - "Up Arrow" и "Down Arrow".

Присоединённый файл ( Кол-во скачиваний: 49 )
Присоединённый файл  ListView_SortHeader.zip 15,10 Kb
PM   Вверх
artsb
Дата 12.6.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



О! Вот так работает. Большое спасибо!


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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