【问题标题】:Custom dropdown for CComboBoxCComboBox 的自定义下拉菜单
【发布时间】:2011-02-06 15:54:00
【问题描述】:

我正在尝试为CComboBox 的派生词创建自定义下拉列表。下拉菜单将是一个日历控件加上一些“热点”,例如

所以我认为实现这一点的最佳方法是有一个简单的CWnd-派生类作为日历控件的父类,并让它自己绘制热点。

窗口需要是一个弹出窗口——我认为——而不是一个子窗口,这样它就不会被剪裁。但是这样做会导致对话框(其中放置组合框控件)不再是最顶层(前景?)窗口,从而导致其框架的绘制方式不同:

alt text http://img693.imageshack.us/img693/3474/35148785.png

这破坏了下拉菜单是组合框一部分的错觉,因为此时它更像是一个模式对话框。 关于如何使自定义下拉菜单的行为类似于常规下拉菜单的任何建议?

还有其他需要注意的陷阱吗?焦点和鼠标捕获问题?

【问题讨论】:

    标签: c++ mfc controls


    【解决方案1】:

    创建弹出窗口时,您需要指定其所有者。拥有的弹出窗口将在您激活它们时激活它们的所有者。不指定所有者将导致您的窗口被激活,从而导致您看到的所有者发生变化。

    【讨论】:

    • 感谢您的回答。在对 CreateEx 的调用中,我将组合框作为下拉窗口的“父级”传递。当显示下拉窗口时,它会导致对话框框架发生变化。显式调用 SetOwner 没有任何区别。
    【解决方案2】:

    是的,我曾经遇到过这个问题。一个快速的谷歌让我怀疑我通过使用 CreateWindowEx() 并指定 WS_EX_NOACTIVATE 解决了这个问题。我有一些其他代码通过使用 WS_EX_TOOLWINDOW 而不是作为弹出窗口制作窗口来实现相同的效果,但我不确定为什么这样做,我的直觉会说让它成为弹出窗口将是路要走。

    【讨论】:

      【解决方案3】:

      您可以在以下链接中找到两个示例项目,它们在 CComboBox 下拉窗口中放置一个 CTreeCtrl 或一个 CListCtrl 控件...类似,您可以在其中放置任何您需要的东西。以下是链接:

      Tree ComboBox Control

      List ComboBox Control

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-11
        • 2012-10-12
        • 1970-01-01
        • 2021-08-22
        • 2018-11-30
        • 2018-04-17
        • 1970-01-01
        相关资源
        最近更新 更多