【问题标题】:Virtual Combo Box in MFCMFC 中的虚拟组合框
【发布时间】:2018-08-03 05:44:26
【问题描述】:

我在标签页中有 10 个 CComboBox,我想将 10k 数据加载到每个组合框?

加载标签页需要更多时间。

在MFC中如何实现虚拟列表控件之类的虚拟组合框?

我需要在加载选项卡的组合框中设置默认选择。

你能给我一些想法吗?

谢谢

【问题讨论】:

  • 您是否要填充页面OnInitDialog 上的所有 10 个组合框?如果是这样,您可以对组合框进行子类化并延迟填充它们直到它们的SetFocus。我之前在几乎相同的场景中做到了这一点。
  • acraig5075 为您提供了一个很好的解决方案...另一个是使用此控件,它使用派生的 CListCtrl,您可以将其用作虚拟:codeproject.com/articles/1131087/list-combobox-control
  • @acraig5075,如果我在组合框的 setfocus 上加载数据,那么如何通过 OnInitDialog 上的 SelectString() 为组合框设置默认文本。
  • 设置默认选择是一项要求,这在阅读问题时并不是很明显。如果你需要,你应该edit你的问题。
  • 我的直接反应是重新考虑基本设计。包含 10K 项的组合框似乎很难使用,这几乎是在滥用您的用户。

标签: mfc


【解决方案1】:

WinApi 中没有这样的虚拟 Combobox,但您有一些优化。

如果需要,仅将完整数据加载到框中。因此,只有当您收到 CBN_DROPDOWN 事件时,您才会使用所有项目填充该框。否则,您只需插入一个选定的项目。 这种方法有个缺点,就是在关闭的combo中上下光标不起作用。

您也可以仅在框获得焦点时填充框。同样在这种情况下,您只需使用当前选定的项目填充该框。

您获得的最佳结果是使用所有者绘制组合框,而不使用CBS_HASSTRINGCB_ADDSTRING 接收指向您的数据的指针。在DrawItem 中,您使用此指针进行绘图。

您仍然需要向每个盒子添加 10k 个项目,但是没有字符串管理,并且盒子在没有这种内存分配的情况下非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多