【问题标题】:MFC prevent dropdownlist to be closedMFC 防止下拉列表被关闭
【发布时间】:2018-01-24 08:57:03
【问题描述】:

我创建了一个具有自定义列表框的自定义组合框。使用此代码替换组合框的默认列表框:

m_comboBoxInfo.cbSize = sizeof(COMBOBOXINFO);
if (::GetComboBoxInfo(m_hWnd, &m_comboBoxInfo)){
    m_ListBox.SubclassWindow(m_comboBoxInfo.hwndList);
}

我希望始终显示组合框的新下拉列表,即使它失去焦点或用户单击其他控件也是如此。 我试图在 WindProc() 函数中捕获 WM_CAPTURECHANGED 和 WM_KILLFOCUS,但什么都不做。

LRESULT CCustomListBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if (message == WM_CAPTURECHANGED ||
        message == WM_KILLFOCUS){
        return TRUE;
    }
    return CCustomListbox::WindowProc(message, wParam, lParam);
}

但是,它不起作用。您能否告诉我如何防止在失去焦点时关闭下拉列表框。

My combobox looks like this.

【问题讨论】:

  • 您也可以尝试处理WM_ACTIVATEWM_NCACTIVATE 什么都不做,但我相信您将与系统进行一场艰苦的战斗。您可以改用 CBS_SIMPLE 样式,它使列表框始终可见。
  • 为什么使用组合框总是显示强制下拉列表?这打破了组合概念。为什么不直接使用列表框?
  • @zett42 感谢您的建议。我试图处理 WM_ACTIVATE 和 WM_NACTIVATE 什么都不做,但它仍然不起作用。当我点击其他控件时,下拉列表关闭。
  • @AndrewTruckle 我想做一个组合框,当用户点击组合框按钮时,它的下拉列表会关闭。
  • 那么您是否尝试过查看CComboBox::ShowDropDown。 MSDN 说:“显示或隐藏具有 CBS_DROPDOWN 或 CBS_DROPDOWNLIST 样式的组合框的列表框。”请参阅:msdn.microsoft.com/en-us/library/…。另请参阅CComboBox::GetDroppedState

标签: winapi mfc


【解决方案1】:

我希望始终显示组合框的新下拉列表,即使它失去焦点或用户点击其他控件。

我想制作一个组合框,当用户单击组合框按钮时,它的下拉列表关闭。

根据这些要求,我将完全摆脱组合框,而只组合一个编辑控件、一个按钮和一个列表框。您可以完全控制一切,而不必与标准组合框逻辑作斗争。即使你现在可以得到一个“hack”,它也很可能在未来的 Windows 版本中被破坏。

按下按钮时只需切换列表框的显示状态。响应列表框的选择更改事件以更新编辑控件中的文本。

我会将这些控件分组到至少设置了WS_CHILD|WS_TABSTOPWS_EX_CONTROLPARENT 窗口样式的父控件中。后者对于启用键盘导航进出子控件很重要,就好像父控件不存在一样。 “组”控件还将封装来自按钮和列表控件的通知(因为这些是不适合组控件父级的实现细节)。

您甚至可以通过向“组”控件的父级发送WM_COMMAND 消息来模拟常规组合框的通知消息。

【讨论】:

  • 他为什么不能使用CComboBox::GetDroppedStateCComboBox::ShowDropDown的组合来按需展示呢?虽然我倾向于同意你的观点!
  • @AndrewTruckle 显示 LB 不是问题,而是在失去焦点时防止它隐藏。这不是组合框设计的意图(CBS_SIMPLE 除外,但这可能也需要 hack)。
  • @zett42 我的自定义组合框由自定义按钮和自定义列表框组合而成。但是,我不知道如何显示列表框(当下面没有足够的空间时将其显示在按钮顶部等),所以我将组合框的下拉列表子类化。看来这种方式比较难做。
  • 只有编辑和按钮。将列表框放在自己的对话框中并将其设置为弹出窗口等。按需创建并定位它。您,但我认为它需要是无模式的,因为您似乎希望用户仍然与对话进行交互。有一个重叠的弹出列表框是没有意义的。对我来说听起来更像是一个无模式的弹出窗口。
  • @zett42 感谢您的支持。我痛苦的日子结束了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多