Вопрос по столбцам в таблице (CListCtrl)
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 12.02.19 07:52
Оценка:
У меня такой вопрос: есть таблица m_IDC_LIST1 типа CListCtrl (точнее говоря, типа потомка класса CListCtrl).
В этой таблице, допустим, восемь столбцов каждый шириной по 100 единиц (пикселов). Назовём их заголовки как "Столбец 1", "Столбец 2", "Столбец 3", "Столбец 4", "Столбец 5", "Столбец 6", "Столбец 7", "Столбец 8". При этом сама таблица показывает только чентыре столбца--для просмтора остальных столбцов нужно прокручивать (скроллировать) таблицу по горизонтали.

Как сделать так, чтобы при горизонтальной прокрутке (скроллировании) этой таблицы первый и второй столбцы (то есть столбцы с заголовками "Столбец 1" и "Столбец 2") всегда стояли в левой части таблицы, а в оставшейся части таблицы стояли те столбцы, которые соответствуют текущей позиции горизонтального движка? То есть сначала отображаются столбцы "Столбец 1", "Столбец 2", "Столбец 3", "Столбец 4" , потом отображаются столбцы "Столбец 1", "Столбец 2", "Столбец 4", "Столбец 5" , потом отображаются столбцы "Столбец 1", "Столбец 2", "Столбец 5", "Столбец 6" , затем отображаются столбцы "Столбец 1", "Столбец 2", "Столбец 6", "Столбец 7", после отображаются столбцы "Столбец 1", "Столбец 2", "Столбец 7", "Столбец 8".

Что нужно сделать в классе, который является потомком класса CListCtrl ?
1613 г. = 2024 г.
Re: Вопрос по столбцам в таблице (CListCtrl)
От: Maniacal Россия  
Дата: 12.02.19 09:26
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Что нужно сделать в классе, который является потомком класса CListCtrl ?

Ну, можно тупо два листа сделать и один скроллбар. А то уж очень сильно придётся заморачиваться, перегружая DrawItem и там самому прорисовывать столбцы.
Re[2]: Вопрос по столбцам в таблице (CListCtrl)
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 12.02.19 12:24
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Здравствуйте, RussianFellow, Вы писали:


RF>>Что нужно сделать в классе, который является потомком класса CListCtrl ?

M>Ну, можно тупо два листа сделать и один скроллбар.

То есть создаём панель (диалог), прокручиваемую по вертикали. На эту панель вешаем рядом две таблицы, правая из которых прокручивается по горизонтали. Я правильно понял?

M>А то уж очень сильно придётся заморачиваться, перегружая DrawItem и там самому прорисовывать столбцы.


Нельзя ли рассказать поподробнее, как это делается? Есть ли CListCtrl методы OnVertScroll и OnHorizScroll (или как они там называются), в которых осуществляется прорисовка таблицы? В каких случая и откуда вызывается метод DrawItem?
1613 г. = 2024 г.
Re[3]: Вопрос по столбцам в таблице (CListCtrl)
От: Maniacal Россия  
Дата: 12.02.19 15:17
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>То есть создаём панель (диалог), прокручиваемую по вертикали. На эту панель вешаем рядом две таблицы, правая из которых прокручивается по горизонтали. Я правильно понял?


Вертикальный скролл можно поместить в правую таблицу и по событию прокручивать и левую. Или же отдельный скролл повесить на диалог. Горизонтальный скролл опять же можно только у правой таблицы сделать, но естественнее будет смотреться если скролл отдельный, но будут проблемы со скрытием основного скролла, хоть и есть костыли в интернете.

M>>А то уж очень сильно придётся заморачиваться, перегружая DrawItem и там самому прорисовывать столбцы.

RF>Нельзя ли рассказать поподробнее, как это делается? Есть ли CListCtrl методы OnVertScroll и OnHorizScroll (или как они там называются), в которых осуществляется прорисовка таблицы? В каких случая и откуда вызывается метод DrawItem?
Если листу задать стиль LVS_OWNERDRAWFIXED, то огда он сам отрисовывать будет только заголовки колонок, а содержимое нужно будет рисовать самому в DrawItem. Это чуть ли не единственная из функций, которую можно перегружать. Там уже можно и выбирать где и как рисовать и рисовать ли. Есть пример расширенного контрола на основе CListCtrl с реализаций DrawItem: https://www.codeproject.com/Articles/68/SuperGrid-Yet-Another-listview-control
Re: Вопрос по столбцам в таблице (CListCtrl)
От: VladFein США  
Дата: 13.02.19 00:42
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Что нужно сделать в классе, который является потомком класса CListCtrl ?


Можно обрабатывать CListCtrl::OnHScroll, и если скрол идёт налево — скрыть нужный столбец (используя CListCtrl::SetColumnWidth с нулевой шириной), а если направо — восстановить.
И никакой DrawItem!
Re[2]: Вопрос по столбцам в таблице (CListCtrl)
От: Maniacal Россия  
Дата: 13.02.19 14:59
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, RussianFellow, Вы писали:


RF>>Что нужно сделать в классе, который является потомком класса CListCtrl ?


VF>Можно обрабатывать CListCtrl::OnHScroll, и если скрол идёт налево — скрыть нужный столбец (используя CListCtrl::SetColumnWidth с нулевой шириной), а если направо — восстановить.

VF>И никакой DrawItem!

Ну тут ещё немного костылей придётся добавить. У CListCtrl нет функции OnHScroll, а LVN_ENDSCROLL ни в какую ловиться не хочет. А ещё содержимое будет скроллиться, нужно будет откатывать отскролленное назад. Но можно момент перерисовки при скроллировании перехватывать в OnNMCustomdraw. А ещё скроллбар сокращаться будет вплоть до исчезновения. Решается внешним скроллбаром. Но и там ещё придётся шаманить, чтобы скрыть встроенный в CListCtrl скроллбар. А если его отключить, то ни на какие функции прокрутки CListCtrl реагировать не будет. Там хитро размер скроллбара до нуля уменьшается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.