【发布时间】: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);
}
但是,它不起作用。您能否告诉我如何防止在失去焦点时关闭下拉列表框。
【问题讨论】:
-
您也可以尝试处理
WM_ACTIVATE或WM_NCACTIVATE什么都不做,但我相信您将与系统进行一场艰苦的战斗。您可以改用CBS_SIMPLE样式,它使列表框始终可见。 -
为什么使用组合框总是显示强制下拉列表?这打破了组合概念。为什么不直接使用列表框?
-
@zett42 感谢您的建议。我试图处理 WM_ACTIVATE 和 WM_NACTIVATE 什么都不做,但它仍然不起作用。当我点击其他控件时,下拉列表关闭。
-
@AndrewTruckle 我想做一个组合框,当用户点击组合框按钮时,它的下拉列表会关闭。
-
那么您是否尝试过查看
CComboBox::ShowDropDown。 MSDN 说:“显示或隐藏具有 CBS_DROPDOWN 或 CBS_DROPDOWNLIST 样式的组合框的列表框。”请参阅:msdn.microsoft.com/en-us/library/…。另请参阅CComboBox::GetDroppedState。