检测单击列表控件中的空白项

时间:2013-04-04 16:26:11

标签: c++ mfc listcontrol

在我的基于mfc对话框的应用程序中,有一个CListCtrl。当用户点击列表控件中的空项时,我需要禁用一个按钮。我使用了NM_CLICK消息并实现了这一点。但是,如果用户将鼠标拖出列表控制区域并释放鼠标,则不起作用。我发现只有在接收按钮消息时才会调用NM_CLICK的原因。是否有任何其他解决方案。

4 个答案:

答案 0 :(得分:1)

  

但是如果用户将鼠标拖出列表控制区域并释放鼠标,则无效。

这完全是设计的,你不应该希望这些点击“计数”。这是用户在点击过程中改变主意的唯一方式。它的工作原理如下:

  • 开始单击列表框控件中的对象(或空白区域)
  • 改变主意
  • 在按住鼠标按钮的同时(即,在提交单击之前),将鼠标指针拖到控件的边界之外
  • 想想:哇!那是一个近距离的电话!

您会注意到,在Windows中,在释放鼠标按钮(通常称为“MouseUp”)之前,操作永远不会发生。如果不支持,则用户无法在操作的早期挽救,这是任何用户界面的关键功能。

答案 1 :(得分:0)

有一些可行的选择。 在父对话框中,MouseUp Handler函数可用于此。

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

通过使用point,可以检查是否发生了鼠标释放CListCtrl。 如果是,则只需禁用该按钮。

此外,WindowFromPoint可以是另一种选择。

static CWnd* PASCAL WindowFromPoint(POINT point);

在诸如OnMouseMove中,如果使用此功能,则可以通过鼠标检查窗口。

答案 2 :(得分:0)

实现一个LVN_ITEMCHANGED处理程序,并在该处理程序中selected item count为零后立即禁用该按钮。

答案 3 :(得分:0)

我找到了问题的解决方案。如果用户使用左键即LVN_BEGINDRAG拖动鼠标,则可以处理消息。通过在OnBeginDrag函数中处理此消息,我更新按钮状态。一旦用户尝试按钮,按钮就会更新拖动鼠标。代码如下: 在标题中添加

afx_msg void OnBeginDrag( NMHDR* pNMHDR, LRESULT *pResult );

在实现中添加消息映射和相应的功能:

  

BEGIN_MESSAGE_MAP(..)

     

ON_NOTIFY(LVN_BEGINDRAG,IDC_LIST1,OnBeginDrag)

     

END_MESSAGE_MAP

     

OnBeginDrag(....)

     

{

     

Updatebutton();

     

}

它解决了这个问题。谢谢大家的支持。