Как (быстро) заполнить CListCtrl в C++ (MFC)?
в моем приложении у меня есть несколько таблиц CListCtrl. Я заполняю / обновляю их данными из массива с for-loop. Внутри цикла я должен внести некоторые коррективы в то, как я отображаю значения, поэтому привязка данных никоим образом невозможна.
реальная проблема-это время, необходимое для заполнения таблицы, так как он перерисовывается построчно. Если я превращаю элемент управления невидимым, пока он заполнен, и снова делаю его видимым, когда цикл выполнен, весь метод много быстрее!
теперь я ищу способ остановить перекраску элемента управления, пока он не будет полностью заполнен. Или любым другим способом ускорить процесс.
2 ответов
посмотрите на метод SetRedraw. Вызовите SetRedraw(FALSE) перед началом заполнения элемента управления, SetRedraw(TRUE) по завершении.
Я бы также рекомендовал использовать RAII для этого:
class CFreezeRedraw
{
public:
CFreezeRedraw(CWnd & wnd) : m_Wnd(wnd) { m_Wnd.SetRedraw(FALSE); }
~CFreezeRedraw() { m_Wnd.SetRedraw(TRUE); }
private:
CWnd & m_Wnd;
};
затем использовать как:
CFreezeRedraw freezeRedraw(myListCtrl);
//... populate control ...
вы можете создать искусственный блок вокруг кода, где вы заполняете элемент управления списком, если хотите freezeRedraw
выйти из области действия до окончания функции.
Если у вас много записей, возможно, более целесообразно использовать стиль виртуального списка (LVS_OWNERDATA
). Вы можете найти более подробную информацию здесь.