我有一个包含 1000 个字符串的数组要加载到组合框中。将字符串数组加载到组合框中的最快方法是什么?
除了遍历字符串列表,一次将每个字符串放入组合框中,还有其他方法吗?
以及如何将加载后的组合框数据复制到其他 10 个其他组合框?
我有一个包含 1000 个字符串的数组要加载到组合框中。将字符串数组加载到组合框中的最快方法是什么?
除了遍历字符串列表,一次将每个字符串放入组合框中,还有其他方法吗?
以及如何将加载后的组合框数据复制到其他 10 个其他组合框?
如果您在 10 个组合框中重复了 1,000 个字符串,您可能需要考虑使用所有者绘制的组合框,它根据数组中的索引动态绘制字符串,而不是将它们存储在组合框中。速度更快,内存效率更高。查看在线帮助中的DrawItem方法和DRAWITEMSTRUCT结构。基本上,您会使用InitStorage和InsertString(如 NuSonic 所述)在您的组合框中创建 1000 个空白项,并覆盖DrawItem以根据索引提取和绘制所需的字符串,因为它需要被绘制。
我不知道以原子方式加载多个字符串的任何方法,但是您可以采取一些措施来提高该过程的效率:
可能比具有 DrawItem 的 CComboBox 更快的是所有者数据 CListCtrl。这也有助于您将项目的子集复制到其他列表中,因为可以使用公共数据源。
我建议这样做是因为包含 1000 个项目的 CComboBox 不会很有用。
我会考虑使用选择列表而不是组合框来提高性能。
在 UI 列表中插入许多项目时提高性能的一般经验法则是在插入之前调用并在之后将其设置回 true。
这是正确的语法
#define NB_ITEM 1000
#define ITEM_LENGTH 10
void CMFCComboDlg::InitMyCombo()
{
CString _strData;
m_cbMyCombo.SetRedraw( FALSE );
m_cbMyCombo.Clear();
m_cbMyCombo.InitStorage(NB_ITEM, ITEM_LENGTH);
for( int i = 0; i < NB_ITEM; i++ )
{
_strData.Format( L"Test %ld", i );
m_cbMyCombo.InsertString( i, _strData );
}
m_cbMyCombo.SetCurSel(0);
m_cbMyCombo.SetRedraw( TRUE );
}
编辑:改进解决方案以包含 smacl 建议
我遇到了这个问题并以两种方式解决了它,具体取决于 # 个项目。设置为不绘制和初始化存储对我来说没有任何区别。让所有者绘制一个也是可行的,但我有大量的组合框。假设每个组合框都有一个固定列表,不改变内容,列表设置一次。
非常大 # 项目:使用 SetWindowText 使组合框变得简单/禁用以设置初始字符串,并且它旁边的一个小按钮打开一个对话框,让您在数据的报告模式下从列表控件中选择项目'已经在组合框中(可以在对话框中完成任何操作)。
中等#项目:制作了一个自定义派生组合框类,它覆盖了 AddString、SelectString 和处理 OnDropDown。当您添加项目时,它会将它们放入一个临时向量中,然后在 SelectString 上(也可以执行 SetCurSel 覆盖),它会添加它找到并选择的一个项目。下拉时,它会重置组合框并添加所有项目并选择当前选定的项目。删除组合框的速度略有放缓,但在项目数量较少时并不明显。
它使我的对话框加载速度更快,并且在没有所有者绘制的情况下仍然可以正常工作。