【问题标题】:How to (fast) fill a CListCtrl in C++ (MFC)?如何(快速)在 C++(MFC)中填充 CListCtrl?
【发布时间】:2010-11-09 17:16:10
【问题描述】:

在我的应用程序中,我有几个 CListCtrl 表。我用带有 for 循环的数组中的数据填充/刷新它们。在循环内部,我必须对显示值的方式进行一些调整,因此根本不可能以任何方式进行数据绑定。

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

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

【问题讨论】:

    标签: c++ mfc clistctrl


    【解决方案1】:

    查看方法 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;
    };
    

    然后使用like:

    CFreezeRedraw freezeRedraw(myListCtrl);
    //... populate control ...
    

    如果您希望freezeRedraw 在函数结束之前超出范围,您可以在填充列表控件的代码周围创建一个人工块。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        相关资源
        最近更新 更多