Winapi MFC防止下拉列表关闭

Winapi MFC防止下拉列表关闭,winapi,mfc,Winapi,Mfc,我创建了一个具有自定义列表框的自定义组合框。combobox的默认列表框被以下代码替换: m_comboBoxInfo.cbSize = sizeof(COMBOBOXINFO); if (::GetComboBoxInfo(m_hWnd, &m_comboBoxInfo)){ m_ListBox.SubclassWindow(m_comboBoxInfo.hwndList); } 我希望组合框的新下拉列表始终显示,即使它失去焦点或用户单击其他控件。 我试图在WindProc(

我创建了一个具有自定义列表框的自定义组合框。combobox的默认列表框被以下代码替换:

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);
}
然而,它不起作用。您能告诉我当下拉列表框失去焦点时如何防止关闭它吗

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

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

有了这些要求,我将完全摆脱组合框,而只是组合一个编辑控件、一个按钮和一个列表框。您可以完全控制一切,而无需对抗标准的组合框逻辑。即使你现在能找到一个“黑客”,它很可能在未来的Windows版本中被破解

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

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


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

您也可以尝试处理
WM_ACTIVATE
WM_NCACTIVATE
而不做任何事情,但我相信您将与该系统进行艰苦的斗争。您可以改为使用
CBS\u SIMPLE
样式,使列表框始终可见。为什么要使用组合框并始终显示强制下拉列表?这打破了组合的概念。为什么不用列表框?@zett42谢谢你的建议。我试图处理WM_ACTIVATE&WM_NACTIVATE,但它仍然不起作用。当我单击其他控件时,下拉列表关闭。@andretruckle我想制作一个组合框,当用户单击组合框按钮时,其下拉列表关闭。那么您是否尝试查看
cmbobox::ShowDropDown
。MSDN说:“显示或隐藏具有CBS_下拉列表或CBS_下拉列表样式的组合框的列表框。”请参阅:。另请参见
cmbobox::GetDroppedState
。为什么他不能结合使用
cmbobox::GetDroppedState
cmbobox::ShowDropDown
来按需显示它?虽然我倾向于同意你@AndrewTruckle显示LB不是问题所在,而是防止它在焦点丢失时隐藏。这不是组合框设计的初衷(CBS_SIMPLE除外,但这可能也需要一些技巧)。@zett42我的自定义组合框由一个自定义按钮和一个自定义列表框组合而成。但是,我不知道如何显示列表框(当bellow.etc没有足够的空间时,将其显示在按钮顶部),因此我将组合框的下拉列表分为子类。这样做似乎比较困难。只需按“编辑”和“编辑”按钮即可。将列表框放在自己的对话框中,并将其设置为弹出窗口等。根据需要创建列表框并定位。但我认为它需要是非模态的,因为您似乎希望用户仍然与对话交互。有一个重叠的弹出列表框是没有意义的。听起来更像是一个非模态弹出窗口。@zett42感谢您的支持。我痛苦的日子结束了。非常感谢你。