【问题标题】:Adding Large Number of Strings to MFC Combobox向 MFC 组合框添加大量字符串
【发布时间】:2016-06-29 11:17:11
【问题描述】:

我有大量的字符串要加载到 MFC 组合框。要设置组合框的宽度,我对每个字符串都使用 GetTextExtent 并在组合框上设置最大范围。这非常耗时,因为调用 GetTextExtent 需要花费大量时间。在添加 25000 个字符串时,这变得非常昂贵。有没有其他方法可以获得我可以在组合框上设置的确切宽度?

【问题讨论】:

  • 我尝试了 Graphics.MesasureString,它也花费了同样多的时间。有没有其他办法?
  • 问题:我假设您在进行选择后担心组合框 edit 部分中字符串的宽度。您是否担心如果组合框的宽度不够,字符串会被截断?
  • 25000 个元素 - 我会作弊。 GetTextExtent 在一个平均字符上 - 比如 'a' 并乘以最长字符串长度中的字符数。
  • 我担心组合框的下拉框的宽度。我确实有一个 SetDropdownWidth 但设置哪个值是这里的问题。
  • 我可以质疑你的设计吗?您希望该控件的用户做什么?翻阅这 25,000 个字符串,看看里面有什么?在大集合中查找字符串必须有更好的选择。

标签: c++ combobox mfc


【解决方案1】:

方法 1:查找最坏情况要求

开始于: Which letter of the English alphabet takes up most pixels?

看来字符W 是最宽的字符。 (或使用循环查找最宽的字符)您可以检查最大字符串的长度并制作一个长度相同的字符串,并为所有字符填充W。现在这个字符串的宽度给出了组合框的最坏情况要求,如果它适合你的话。

方法二:保存一些调用

找出最宽和最窄字符的比例。现在找到最大字符串的长度。现在进行第二次迭代,仅找到字符串长度大于largest_length * ratio 的字符串宽度。这将节省一些电话。

【讨论】:

  • 我使用了第一种方法,但我的客户对 UI 不满意。你能解释一下方法 2 的工作原理吗?
  • 假设最宽的字符是W,宽度为24,最小宽度的字符是i,宽度为12。现在假设最大字符串的长度是50。现在,即使这个最大的字符串由所有is 组成,它也会比所有大小为25 或更大的字符串占用更多的空间。即使它们是由所有Ws 组成的。这意味着您可以跳过检查长度为 25 及以下的所有字符串的文本宽度。 (max_len * least_wide_char / widest_char)。
  • 有什么办法可以在组合框的下拉列表中设置调整大小选项?
【解决方案2】:

当要显示太长的字符串时,您可以动态更新 ComboBox 的宽度。如果您有 25000 个职位要显示,那么迟早您将拥有两倍的职位。另一个提示是使用 Virtual ListCtrl - 但只有在将所有这些字符串添加到组合框中太慢时才会这样做。

【讨论】:

  • 有什么办法可以将resize选项设置到组合框的下拉列表中?
  • @user273121 我不确定我是否理解,但请参阅这篇文章:weseetips.wordpress.com/tag/adjust-combobox-dropdown-width,你应该使用 CComboBox::SetDroppedWidth
  • 嗨,我已经在使用这个选项了。但是要设置 dropdwon 框的宽度,出于性能问题,我不想使用 GetTextExtent() 方法。因此,如果我为我的下拉框设置一个近似宽度,我希望有一个可调整大小的抓手,客户可以使用它将下拉框扩展到所需的大小,就像我们调整窗口大小一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多