我创建了一个具有自定义列表框的自定义组合框。使用以下代码替换组合框的默认列表框:
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);
}
然而,它不起作用。你可以告诉我如何在它失去焦点时阻止关闭下拉列表框。
答案 0 :(得分:2)
我希望始终显示组合框的新下拉列表,即使它失去焦点或用户点击其他控件。
我想制作一个组合框,当用户点击组合框按钮时,它的下拉列表会关闭。
根据这些要求,我将完全摆脱组合框,而只是组合编辑控件,按钮和列表框。您可以完全控制所有内容,而无需与标准组合框逻辑作斗争。即使你现在正在“黑客”工作,它很可能在未来的Windows版本中破解。
按下按钮时,只需切换列表框的显示状态即可。对列表框的选择更改事件做出反应,以更新编辑控件中的文本。
我会将这些控件分组到父控件中,该控件至少设置了WS_CHILD|WS_TABSTOP
和WS_EX_CONTROLPARENT
窗口样式。后者对于启用键盘导航进出子控件非常重要,就好像父控件不存在一样。 “组”控件还将封装来自按钮和列表控件的通知(因为这些是不适用于组控件的父级的实现细节)。
您甚至可以通过向“组”控件的父级发送WM_COMMAND
消息来模拟常规组合框的通知消息。