【问题标题】:multiple CComboBox sharing the same data多个 CComboBox 共享相同的数据
【发布时间】:2008-12-04 21:37:22
【问题描述】:

我有一个 MFC 对话框,上面有 32 个 CComboBox,它们在列表框中都有相同的数据。它需要一段时间才能出现,看起来延迟的一部分是我需要花费时间使用 InsertString() 将所有数据添加到 32 个控件。如何子类化 CComboBox 以便 32 个实例共享相同的数据?

【问题讨论】:

  • 您要向每个组合框添加多少项?

标签: c++ mfc


【解决方案1】:

填充组合时关闭窗口重绘。例如:

m_wndCombo.SetRedraw(FALSE);
// Fill combo here
...
m_wndCombo.SetRedraw(TRUE);
m_wndCombo.Invalidate();

这可能会有所帮助。

【讨论】:

  • 我认为您需要确保在执行此操作后调用 Invalidate。
  • 如果从 WM_INITDIALOG IIRC 调用则不会,但很好发现。 :)
  • 修复症状但不回答问题。
【解决方案2】:

我会尝试的第一件事是调用“InitStorage”来为字符串预分配内存。 来自 MSDN:

// Initialize the storage of the combo box to be 256 strings with // about 10 characters per string, performance improvement.

int n = pmyComboBox->InitStorage(256, 10);

【讨论】:

    【解决方案3】:

    除了已经说过的内容之外,您还可以在组合框中关闭排序并在插入数据之前对其进行预排序。

    【讨论】:

      【解决方案4】:

      按照您的要求,一种方法是由所有者绘制 - 您将编写相当多的代码,但您不必将数据添加到所有代码中。 "CComboBox::DrawItem"

      Support.microsoft 有这篇关于子类化组合框的文章,这可能也很有趣 "How to subclass CListBox and Cedit inside of CComboBox"

      真的有人要问是否值得付出努力,而这在很大程度上取决于诸如

      之类的事情
      • 列表中的条目数
      • 对话框显示的次数
      • 组合内容的可变性
      • 在别处优化
        • 在屏幕完成之前不绘制
        • 只构建一次对话框并重新显示它。
        • 使用一个组合,但在不同时间在不同位置显示它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-10
        • 2011-10-23
        • 2010-09-17
        • 2017-03-06
        • 1970-01-01
        • 2017-01-17
        • 2020-06-16
        • 1970-01-01
        相关资源
        最近更新 更多