Combobox mfc组合框按钮复杂控件:第一次单击按钮时不会触发Lbutton down事件

Combobox mfc组合框按钮复杂控件:第一次单击按钮时不会触发Lbutton down事件,combobox,mfc,listbox,Combobox,Mfc,Listbox,我正在mfc中创建一个带有一个组合框和一个按钮的复杂控件。该组合框具有样式CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS|u VISIBLE | WS|u CHILD | WS|u VSCROLL,并且它是可编辑的组合框。我使用COleControl类作为这两个控件的父类 当下拉列表打开时,如果我第一次单击按钮,下拉列表将关闭,并且不会为按钮生成lbutton down事件。如果我第二次单击按钮,将生成lbutton down事件。这里的问题是我需要第一次生成lbu

我正在mfc中创建一个带有一个组合框和一个按钮的复杂控件。该组合框具有样式CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS|u VISIBLE | WS|u CHILD | WS|u VSCROLL,并且它是可编辑的组合框。我使用COleControl类作为这两个控件的父类

当下拉列表打开时,如果我第一次单击按钮,下拉列表将关闭,并且不会为按钮生成lbutton down事件。如果我第二次单击按钮,将生成lbutton down事件。这里的问题是我需要第一次生成lbutton事件


请有人帮帮我。提前谢谢…

这就是Windows控件的工作原理。当一个组合框打开,您单击它之外的某个位置时,它将关闭,而单击将被忽略

如果你真的想做你所描述的事情,你能做什么?虽然你不应该这样做,但做起来很麻烦,在这个总的想法上,你需要解决很多边缘问题

子类组合框 抓住巴顿顿顿 从派生类调用默认处理程序 然后使用::SendInput将消息以正确的坐标重新发布到全局队列
首先,您不接收任何事件,因为Windows控件接收/生成消息,而不是事件。 没有WM_SETCAPTURE这样的消息

当鼠标左键单击下拉按钮区域中的组合时,组合调用将显示一个下拉列表框,并调用SetCapture在下拉框窗口中设置捕获。 无论光标位置如何,下拉列表框都会接收到任何连续的鼠标左键按下消息

下拉框隐藏,释放鼠标捕获,combo接收带有CBN_特写通知代码的命令消息,如果选择被更改,则接收带有CBN_SELCHANGE代码的另一个命令消息。 正如您所看到的,单击并没有被忽略,而是被下拉列表框使用

    COMBOBOXINFO cmbi = { sizeof(COMBOBOXINFO) };

    m_Combo.GetComboBoxInfo(&cmbi);

    m_DropListBox.SubclassWindow(cmbi.hwndList);
如果要在对话框或自定义控件中对按钮或任何其他控件进行鼠标单击,则必须执行一些额外的编码

我有一个示例应用程序来演示我的方法

示例中演示了您必须执行的一些操作:

子类组合框使用向导添加CComboBox类型的变量

从CListBox CDropListBox派生类

在OnInitDialog和子类下拉列表框中获取组合框信息

    COMBOBOXINFO cmbi = { sizeof(COMBOBOXINFO) };

    m_Combo.GetComboBoxInfo(&cmbi);

    m_DropListBox.SubclassWindow(cmbi.hwndList);
添加WM_LBUTTONDOWN消息的处理程序,并添加示例中的代码

现在,每次调用基类时删除下拉列表框时,WM_LBUTTONDOWN消息都将转发到生成WM_LBUTTONDOWN消息时光标下的任何控件


我怀疑组合的droplist部分在可见时使用WM_SETCAPTURE获取所有鼠标输入,以便它能够检测自身之外的鼠标点击。