Знаете как создать wxListCtrl с одной колонкой, ширина которой равна ширине контрола? не уже – что бы выделение было красивым и удобным для пользователя, не шире что бы не появлялась линейка прокрутки вообщем сделать так как должно быть в нормально продукте. Я думал просто, я был удивлен, нормального пути нет или я его не нашел.
Поскольку контрол в сайзере ширина его точно не известна, я смог сделать только так :
m_TransitionList = new wxListCtrl(.... m_TransitionList->Connect(wxEVT_SIZE, wxSizeEventHandler(MovieMaker::OnTransitionListSize)); // for correct resizing width of column
Ну и сам обработчик :
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); }
Учтите что обработчик принадлежит класу создающему wxListCtrl, а не класу контрола, поэтому this у него не “правильный”, берем родителя (в моем случае дедушку), кастим к нужному класу и устанавливаем ширину. Почему то пришлось вычитать еще 6 пикселов (?!), число 6 подобранно эксперементально.
Вот теперь у нас нормальный лист контрол который не стыдно отдать юзверю, а вы как решаете эту проблему?
Update: Новая более правильная версия, спасибо Алексею за облагораживание кода:
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); }