wxListCtrl и джедайские приемы

June 19th, 2009 Begemot Posted in Программирование

Знаете как создать wxListCtrl с одной колонкой, ширина которой равна ширине контрола? не уже – что бы выделение было красивым и удобным для пользователя, не шире что бы не появлялась линейка прокрутки вообщем сделать так как должно быть в нормально продукте. Я думал просто, я был удивлен, нормального пути нет или я его не нашел.

Поскольку контрол в сайзере ширина его точно не известна, я смог сделать только так :
[sourcecode language=”cpp”]
m_TransitionList = new wxListCtrl(….
m_TransitionList->Connect(wxEVT_SIZE, wxSizeEventHandler(MovieMaker::OnTransitionListSize)); // for correct resizing width of column
[/sourcecode]

Ну и сам обработчик : 

[sourcecode language=”cpp”]
void MovieMaker::OnTransitionListSize(wxSizeEvent& event)
{
if (wxListCtrl * list = ((MovieMaker*)GetParent()->GetParent())->m_TransitionList)
list->SetColumnWidth(0, list->GetSize().GetWidth() – wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) – 6);
}
[/sourcecode]

Учтите что обработчик принадлежит класу создающему wxListCtrl, а не класу контрола, поэтому this у него не “правильный”,  берем родителя (в моем случае дедушку), кастим к нужному класу  и устанавливаем ширину. Почему то пришлось вычитать еще 6 пикселов (?!), число 6 подобранно эксперементально.

Вот теперь у нас нормальный лист контрол который не стыдно отдать юзверю, а вы как решаете эту проблему?

Update: Новая более правильная версия, спасибо Алексею за облагораживание кода:

[sourcecode language=”cpp”]
void MovieMaker::OnTransitionListSize(wxSizeEvent& event)
{
if (wxListCtrl * list = dynamic_cast<wxListCtrl*>(event.GetEventObject()))
list->SetColumnWidth(0, list->GetSize().GetWidth() – wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) – 6);
}
[/sourcecode]

Related:

16 Responses to “wxListCtrl и джедайские приемы”

  1. По линуксом всё нормально после такого шаманства? Т.е. там тоже надо вычитать эти 6ть пикселов? Ну и в винде со сменой темы ничего не съехало?

  2. Прикольный код. Правда получение списка кривое до безобразия. Советую прочитать про метод GetEventObject у wxEvent’а.

  3. MoonLight, под линуксом не проверяли под виндами тоже. Но максимум что может быть или колонка будет немного уже чем должна быть или появится вертикальная линейка прокрутки – и то и то не смертельно

    Алексей спасибо, попробую завтра. А ты уже перевел про эту главу? 🙂

  4. А можно узнать, в чем цель такого изврата? Т.е. почему не использовать wxListBox, который уже является “wxListCtrl с одной колонкой, ширина которой равна ширине контрола”

  5. Потому что необходимо иметь айтемы с картинками

  6. Ага. теперь понятно 🙂 Ситхов на вас нету…

  7. А можно еще wxTreeCtrl использовать для айтемов с картинками

  8. Да наверное, запомню и если что в следуюший раз поэксперементирую, но не факт что там полная совместимость…

  9. хм, джедая из меня не получится…
    1. Наследуем класс от wxPanel
    2. Добавляем на него wxBoxSizer( wxVERTICAL )
    3. На который в свою очередь добавляем wxStaticBoxSizer( wxHORIZONTAL, wxPanel, _(“blabla”) )
    4. И уже туда любой контрол, например wxChoice( wxPanel,.. )
    НЕТУ КОНТРОЛА! blabla есть, контрола нет
    если на этапе №3 создавать wxBoxSizer контрол появляется
    а если наследовать класс от wxDialog все работает
    wxWinCE 2.8.9 на Windows Mobile 5.0 🙂

  10. кстати, ничего если я периодически буду здесь размазывать свои сопли, а то иногда так хочется высказаться ( поплакаться )? Плюс пока приводишь мысли в порядок и аккуратно их расписываешь решение само иногда приходит в голову?

  11. Можно, но с винСЕ Я наврядле помогу:)

    Кстати, а почему 2.8.9 – уже 10 стабильная вышла давно, и куча багфиксов уже в ней есть:)

  12. ну не знаю, не знаю… в 2.8.10 меню с двумя элементами не работает. с тремя и более – пожалуйста, а с двумя ( для софт-кнопок ) – нет. Оно отрисовывается и реагирует на клик, но, по моему, событие не генерируется.
    Если только из svn собрать и посмотреть.

  13. сначала можно просто поискать в баг-трекере…

  14. Подзатыльников за этот пост получишь три сразу %)
    1. За гаринг продакшн кода
    2. За отсутствие проверок того, что возвращает GetParent()
    3. За C-Style кастование вместо wxDynamicCast()

  15. *шаринг.

    Кстати… чего редактировать каменты не даешь? Хотя бы в 15тиминутный интервал

  16. Зато я не заставляю подчиненых заниматься идиотской работой, переписывая полностью правильный код, в какую-то ерунду…:)

    Дык, это поставить что-то надо, надо разобраться. Как-то мысли не было