Ноя
11

Автоматическая установка ширины столбцов в wxListCtrl




  • Про закон Эллиота, Россию и телевидение….

  • Доброе дело .Почему площадка для турникменов пустует?


  • Меня всегда раздражало вручную подбирать ширину столбцов в wxListCtrl в режиме отображения wxLC_REPORT. Сначала делал вручную, подбирая размер в коде программы. Потом решил обрабатывать wxSizeEvent, но при этом приходилось сабкласситься и еще вручную высчитывать ширину столбца по самому длинному "item" или "header", что тоже не добавляло радости. И вот теперь я узнал (точнее, все-таки прочитал документацию (как в анекдоте: если ничто другое не помогает, простите, наконец, инструкцию :)), нашел следующее:
    SetColumnWidth(column, width) - установка ширины столбца и самое главное, что вместо width можно поставить две преоопределенные константы - wxLIST_AUTOSIZE и wxLIST_AUTOSIZE_USEHEADER. При использовании wxLIST_AUTOSIZE происходит подгонка ширины столбца по наибольшему по длине содержимому "item". А при использовании wxLIST_AUTOSIZE_USEHEADER по длине содержимого "header" или 80 пикселей, если ОС не поддерживает, или по наибольшему по длине содержимому "item". То есть выбирается наибольшая по длине строка в "item" или "header", и по ней устанавливается ширина столбца. Последний столбец расщиреятся до правой границы wxListCtrl, вне зависимости от длины содержимого.
    Единственная ложка дегтя, эту функцию нужно вызывать для каждого столбца и после каждого изменения содержимого wxListCtrl для пересчета под новые данные. Теперь как это выглядит в коде:

    ...........
    // Создание контрола
    wxListCtrl *listCtrl = new wxListCtrl(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT);

    // Вставка столбцов
    listCtrl->InsertColumn(0, wxT("Colunm 1"));
    listCtrl->InsertColumn(1, wxT("Colunm 2"));
    listCtrl->InsertColumn(2, wxT("Colunm 3"));
    listCtrl->InsertColumn(3, wxT("Colunm 4"));
    listCtrl->InsertColumn(4, wxT("Colunm 5"));

    .........

    // Теперь где-то в коде добавляем данные
    listCtrl->InsertItem(0, wxT("Item 1:1")); // первый столбец
    listCtrl->SetItem(0, 1, wxT("Item 1:2")); // второй столбец
    // и т. д.

    // А теперь вызываем нашу функцию для каждого столбца
    for (int i = 0; i < listCtrl->GetColumnCount(); ++i)
    {
    listCtrl->SetColumnWidth(i, wxLIST_AUTOSIZE_USEHEADER);
    }

    // и все :)

    И еще. При изменении размеров(при уменьшении), когда функция listCtrl->SetColumnWidth(i, wxLIST_AUTOSIZE_USEHEADER); находится в обработчике wxSizeEvent фрейма, иногда появляется горизонтальная полоса прокрутки в контроле. Избавиться от нее можно, вызвав после listCtrl->SetColumnWidth(i, wxLIST_AUTOSIZE_USEHEADER); функцию listCtrl->ScrollList(0, 0);


















  • Про закон Эллиота, Россию и телевидение….

  • Доброе дело .Почему площадка для турникменов пустует?



  • Социальные сети

    Рубрики

    Последние записи