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]
June 20th, 2009 at 10:36 am
По линуксом всё нормально после такого шаманства? Т.е. там тоже надо вычитать эти 6ть пикселов? Ну и в винде со сменой темы ничего не съехало?
June 20th, 2009 at 3:08 pm
Прикольный код. Правда получение списка кривое до безобразия. Советую прочитать про метод GetEventObject у wxEvent’а.
June 21st, 2009 at 11:32 pm
MoonLight, под линуксом не проверяли под виндами тоже. Но максимум что может быть или колонка будет немного уже чем должна быть или появится вертикальная линейка прокрутки – и то и то не смертельно
Алексей спасибо, попробую завтра. А ты уже перевел про эту главу? 🙂
June 22nd, 2009 at 11:59 am
А можно узнать, в чем цель такого изврата? Т.е. почему не использовать wxListBox, который уже является “wxListCtrl с одной колонкой, ширина которой равна ширине контрола”
June 22nd, 2009 at 12:11 pm
Потому что необходимо иметь айтемы с картинками
June 22nd, 2009 at 3:07 pm
Ага. теперь понятно 🙂 Ситхов на вас нету…
June 23rd, 2009 at 9:53 am
А можно еще wxTreeCtrl использовать для айтемов с картинками
June 23rd, 2009 at 10:24 am
Да наверное, запомню и если что в следуюший раз поэксперементирую, но не факт что там полная совместимость…
July 1st, 2009 at 9:57 pm
хм, джедая из меня не получится…
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 🙂
July 1st, 2009 at 10:00 pm
кстати, ничего если я периодически буду здесь размазывать свои сопли, а то иногда так хочется высказаться ( поплакаться )? Плюс пока приводишь мысли в порядок и аккуратно их расписываешь решение само иногда приходит в голову?
July 1st, 2009 at 10:32 pm
Можно, но с винСЕ Я наврядле помогу:)
Кстати, а почему 2.8.9 – уже 10 стабильная вышла давно, и куча багфиксов уже в ней есть:)
July 2nd, 2009 at 8:26 am
ну не знаю, не знаю… в 2.8.10 меню с двумя элементами не работает. с тремя и более – пожалуйста, а с двумя ( для софт-кнопок ) – нет. Оно отрисовывается и реагирует на клик, но, по моему, событие не генерируется.
Если только из svn собрать и посмотреть.
July 2nd, 2009 at 11:43 am
сначала можно просто поискать в баг-трекере…
July 27th, 2009 at 12:42 am
Подзатыльников за этот пост получишь три сразу %)
1. За гаринг продакшн кода
2. За отсутствие проверок того, что возвращает GetParent()
3. За C-Style кастование вместо wxDynamicCast()
July 27th, 2009 at 12:43 am
*шаринг.
Кстати… чего редактировать каменты не даешь? Хотя бы в 15тиминутный интервал
July 27th, 2009 at 7:44 am
Зато я не заставляю подчиненых заниматься идиотской работой, переписывая полностью правильный код, в какую-то ерунду…:)
Дык, это поставить что-то надо, надо разобраться. Как-то мысли не было