我正在用mfc中的一个组合框和一个按钮创建一个复杂的控件。组合框的样式为“CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VISIBLE | WS_CHILD | WS_VSCROLL”,它是可编辑的组合框。我使用COleControl类作为这两个的父级
当下拉列表打开时,如果我第一次点击该按钮,则关闭下拉列表并且没有为该按钮生成lbutton down事件。如果我第二次单击该按钮,则会生成lbutton down事件。这里的问题我是否需要首次生成lbutton事件。
请有人帮帮我。谢谢你...
答案 0 :(得分:0)
这就是Windows控件的工作方式。当组合框打开并且你点击它之外的某个地方时,它会关闭,并且忽略点击。
如果你真的想做你所描述的事情,你可以做什么(虽然你不应该这样做,而且有很多优点,你必须解决这个一般性的想法!):
答案 1 :(得分:0)
首先,您不会收到任何事件,因为Windows控制,接收/生成消息,而不是事件。 没有WM_SETCAPTURE这样的消息。
在下拉按钮区域的组合中单击鼠标左键时,组合调用显示一个下拉列表框,并调用SetCapture在下拉框窗口上设置捕获。 无论光标位置如何,下拉列表框都会接收任何连续的鼠标左键按下消息。
隐藏Drop框,释放鼠标捕获并且combo接收带有CBN_CLOSEUP通知代码的命令消息,如果选择被cjanged,则带有CBN_SELCHANGE代码的另一个命令消息。 如您所见,不会忽略点击,它会被下拉列表框使用。
如果您想继续点击按钮或对话框或自定义控件中的任何其他控件,则必须进行一些额外的编码。
我附上了展示我的方法的示例应用程序。
示例中演示了您必须执行的一些操作:
子类组合框(使用向导添加CComboBox类型的变量)。
从CListBox(CDropListBox)派生类。
获取OnInitDialog和子类下拉列表框中的组合框信息。
COMBOBOXINFO cmbi = { sizeof(COMBOBOXINFO) };
m_Combo.GetComboBoxInfo(&cmbi);
m_DropListBox.SubclassWindow(cmbi.hwndList);
为WM_LBUTTONDOWN消息添加处理程序,并添加样本中的代码。
现在,当您调用基类时,每次下拉列表框都被解除,WM_LBUTTONDOWN消息将被中继到生成WM_LBUTTONDOWN消息时光标下的任何控件。