Как (быстро) заполнить 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). Вы можете найти более подробную информацию здесь.