Знаете как создать 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]