我有一个包含 1000 个字符串的数组要加载到组合框中。将字符串数组加载到组合框中的最快方法是什么?

除了迭代字符串列表、一次将每个字符串放入组合框中之外,还有其他方法吗?

加载后如何将组合框数据复制到其他 10 个组合框?

有帮助吗?

解决方案

如果在10个组合框中重复了1000个字符串,您可能需要考虑使用所有者绘制的组合框,它根据索引将动态字符串绘制到数组中,而不是将它们存储在组合框中。方式更快,方式更高效。在联机帮助中查看 DrawItem 方法和 DRAWITEMSTRUCT 结构。基本上,您可以使用 InitStorage InsertString (如NuSonic所述)在您的组合框中创建1000个空白项目,并覆盖 DrawItem 根据索引提取和绘制所需的字符串,因为它需要绘制。

其他提示

我不知道有什么方法可以原子地加载多个字符串,但是您可以采取一些措施来提高该过程的效率:

  • 在添加项目以预分配内存之前调用 CComboBox::InitStorage
  • 使用 InsertString 而不是 AddString 来防止每次添加时触发排序(假设启用了 CBS_SORT 样式)

可能比使用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覆盖),它会添加一个找到并选择的项目。当下降时,它会重置组合框并添加所有项目并选择当前选择的项目。放下组合框会有轻微的减速,但是少量的项目不明显。

它使我的对话框加载速度更快,并且在没有所有者绘制的情况下仍可完全正常运行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top