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

时间:2014-03-11 07:21:22

标签: combobox mfc listbox

我正在用mfc中的一个组合框和一个按钮创建一个复杂的控件。组合框的样式为“CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VISIBLE | WS_CHILD | WS_VSCROLL”,它是可编辑的组合框。我使用COleControl类作为这两个的父级

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

请有人帮帮我。谢谢你...

2 个答案:

答案 0 :(得分:0)

这就是Windows控件的工作方式。当组合框打开并且你点击它之外的某个地方时,它会关闭,并且忽略点击。

如果你真的想做你所描述的事情,你可以做什么(虽然你不应该这样做,而且有很多优点,你必须解决这个一般性的想法!):

  • 子类组合框
  • catch lbuttondown
  • 从派生类调用默认处理程序
  • 然后将消息重新发布到具有更正坐标的全局队列(使用:: SendInput)

答案 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消息时光标下的任何控件。

Sample download