Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Как реализовать "авторазмер" столбцов в CListCtrl?


Автор: JohnWind 22.1.2008, 17:40
Собственно сабж..
Использую Visual C++ 2005, CListCtrl в режиме рэпорт. виртуальных списков не использую..

 как определить какие столбцы можно сужить или растянуть и как определить ли их надо растягивать ? 
это надо проверять когда заполняю таблицу данными?

Автор: Earnest 23.1.2008, 20:13
Цитата

This method changes the width of a column in report view or list view.

BOOL SetColumnWidth( 
int nCol, 
int cx ); 
Parameters
nCol 
Specifies the index of the column whose width is to be set. In list view, this parameter must be –1. 
cx 
Specifies the new width of the column. Can be either LVSCW_AUTOSIZE, LVSCW_AUTOSIZE_USEHEADER

Вызывать нужно после заполнения, если хочешь, чтобы учитывались данные, а не только хедер. И, естественно, это не означает, что ширина столбца будет меняться "сама" при изменении данных - функция одноразовая - вычислить размер столбца согласно текущим данным.
Цитата(JohnWind @  22.1.2008,  18:40 Найти цитируемый пост)
 как определить какие столбцы можно сужить или растянуть и как определить ли их надо растягивать ? 

Это вообще шикарный вопрос smile Кто же это кроме тебя знает - какие столбцы тебе надо растягивать...

Автор: jonie 23.1.2008, 22:02
Цитата(Earnest @  23.1.2008,  20:13 Найти цитируемый пост)
Цитата(JohnWind @  22.1.2008,  18:40 ) как определить какие столбцы можно сужить или растянуть и как определить ли их надо растягивать ?

Это вообще шикарный вопрос  Кто же это кроме тебя знает - какие столбцы тебе надо растягивать...

он имеет в виду саму возможность: как определить необходимую ширину для текста конкретной строки в конкретной колонке. И прогнав от 0 до size-1 по строкам узнать максимальную ширину, а далее вызвать вышеупомянутый метод, для подгонки размера столбца....

в мфц я не силен.

еще гадаю по портам и md5 хешу имени...)

Автор: Earnest 24.1.2008, 12:39
Цитата(jonie @  23.1.2008,  23:02 Найти цитируемый пост)
он имеет в виду саму возможность: как определить необходимую ширину для текста конкретной строки в конкретной колонке. И прогнав от 0 до size-1 по строкам узнать максимальную ширину, а далее вызвать вышеупомянутый метод, для подгонки размера столбца....

Телепат smile 
Тогда так: чтобы вычислить необходимый размер колонки, нужно взять контекст (CDC), установить туда фонт, полученный от лист-контрола, и прогнать через него все строки, содержащиеся в колонке. Или есть более удобная функция CListCtrl::GetStringWidth, которая делает это же самое, но избавляет нас от необходимости копаться в CDC. В цикле находишь максимальную ширину строки, сравниваешь ее с текущей и определяешь, что нужно сделать.
Тут все зависит от задачи. Например, мы хотим, чтобы все таблица (без горизонтального скрола) помещалась в окно, и все его занимала, и при этом разумно распределялись ширины колонок (т.е. пропорционально данным). Один из вариантов: после заполнения таблицы делаем всем колонкам автосайз по данным, затем определяем их суммарную ширину, затем вычитаем ее из физической ширины окна (клиентской части) и пропорционально распределяем по колонкам. Вычисляя доступную ширину, нужно учитывать наличие вертикального скролла.
Ну и т.д.

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