Как (быстро) заполнить CListCtrl в C ++ (MFC)? - PullRequest
6 голосов
/ 10 июля 2009

в моем приложении у меня есть несколько таблиц CListCtrl. Я заполняю / обновляю их данными из массива с циклом for. Внутри цикла я должен внести некоторые коррективы в то, как я отображаю значения, чтобы привязка данных никоим образом не была возможна вообще.

Настоящей проблемой является время, необходимое для заполнения таблицы, поскольку она перерисовывается строка за строкой. Если я поверну элемент управления невидимым, пока он заполнен, и снова сделаю его видимым после завершения цикла, весь метод будет намного быстрее!

Теперь я ищу способ остановить перекрашивание элемента управления, пока он не будет полностью заполнен. Или любой другой способ ускорить процесс.

Ответы [ 2 ]

18 голосов
/ 10 июля 2009

Посмотрите на метод 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 вышел из области видимости до конца функции.

6 голосов
/ 10 июля 2009

Если у вас много записей, возможно, более целесообразно использовать стиль виртуального списка (LVS_OWNERDATA). Вы можете найти больше информации здесь .

...