如何(快速)在C ++(MFC)中填充CListCtrl?

时间:2009-07-10 13:29:42

标签: c++ mfc clistctrl

在我的应用程序中我有一些CListCtrl表。我用带有for循环的数组填充/刷新它们。在循环内部,我必须对如何显示值进行一些调整,这样就无法以任何方式进行数据绑定。

真正的问题是填充表格所需的时间,因为它是逐行重绘的。如果我在控件填充时将其置于不可见状态并在循环完成后再次显示,则整个方法要快得多!

现在我正在寻找一种方法来阻止控件重新绘制,直到完全填满。或任何其他方式来加快速度。

2 个答案:

答案 0 :(得分:18)

查看方法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在函数结束之前超出范围,可以在填充列表控件的代码周围创建一个人工块。

答案 1 :(得分:6)

如果你有很多记录,那么使用虚拟列表样式(LVS_OWNERDATA)会更合适。您可以找到更多信息here