Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Странный AutoSize у колонок TListView

590
17 июля 2008 года
Gigahard
223 / / 03.04.2006
Задача: Сделать автоматическое масштабирование колонок у компонента TListView.
Казалось бы тривиальная задача, но не все так просто...

Стандартный пустой проект. На форму добавлен TListView в режиме Report и кнопочка.

По ходу выполнения программы, добавляем и убираем колонки в TListView.

Если код:
 
Код:
TListColumn * tmpCol;

        tmpCol= ListView1->Columns->Add();
        tmpCol->Caption="abracadabra";
        tmpCol->AutoSize=true;

        tmpCol= ListView1->Columns->Add();
        tmpCol->Caption="абракадабра";
        tmpCol->AutoSize=true;

добавить в конструктор формы, то все работает нормально. Колонки честно делят пространство ListView.

Но если тот же самый код добавить в обработчик нажатия кнопки, то колонки добавляются, но AutoSize не работает.

Срабатывает он только если изменять размер TListView. Ну а это не всегда выход, т.к. частенько колонки изменяются без изменения размера ListView.

Собственно, как обойти этот косяк?
443
17 июля 2008 года
REmindER
292 / / 23.03.2003
Цитата: Gigahard
Задача: Сделать автоматическое масштабирование колонок у компонента TListView.
Казалось бы тривиальная задача, но не все так просто...

Стандартный пустой проект. На форму добавлен TListView в режиме Report и кнопочка.

По ходу выполнения программы, добавляем и убираем колонки в TListView.

Если код:
 
Код:
TListColumn * tmpCol;

        tmpCol= ListView1->Columns->Add();
        tmpCol->Caption="abracadabra";
        tmpCol->AutoSize=true;

        tmpCol= ListView1->Columns->Add();
        tmpCol->Caption="абракадабра";
        tmpCol->AutoSize=true;

добавить в конструктор формы, то все работает нормально. Колонки честно делят пространство ListView.

Но если тот же самый код добавить в обработчик нажатия кнопки, то колонки добавляются, но AutoSize не работает.

Срабатывает он только если изменять размер TListView. Ну а это не всегда выход, т.к. частенько колонки изменяются без изменения размера ListView.

Собственно, как обойти этот косяк?



Да, собственно, никак. Расчетами ширины колонок занимается приватная функция DoAutoSize класса TCustomListView (см. исходник), от которого происходит TListView. DoAutoSize вызывается только из CreateWnd и из обработчика WM_WINDOWPOSCHANGED. Как решение можно посылать сообщение:

Код:
WINDOWPOS p;

p.hwnd = ListView->Handle;
p.hwndInsertAfter = HWND_NOTOPMOST;

p.x=0;
p.y=0;
p.cx=0;
p.cy=0;
p.flags=SWP_SHOWWINDOW;

SendMessage(p.hwnd, WM_WINDOWPOSCHANGED, 0, (UINT) &p);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог