2013-04-04 63 views
-1

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

回答

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();

}

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

0

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

afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 

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

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

static CWnd* PASCAL WindowFromPoint(POINT point); 

在诸如OnMouseMove中,如果使用此函数,则可以检查窗口是否被鼠标指向。

0

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

1

但是,如果用户将鼠标拖出列表控制区域并释放鼠标,这不起作用。

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

  • 开始到列表框控件对象(或空白区域)上单击
  • 改变主意
  • 尽管仍然按住鼠标按钮(即提交之前你单击),将鼠标指针拖到控件边界之外
  • Think:Whew!这是一个密切的呼叫!

你会发现,在Windows中,动作永远不会发生,直到鼠标按钮发布(通常被称为“的MouseUp”)。如果这不被支持,那么用户就无法在任何用户界面的关键功能之前提前撤出操作。

+0

我同意你的看法,但我们正在谈论编程,当然程序员不能完全预测用户的想法。但需要一个解决方案。 – CodeRider 2013-04-05 09:24:55

+0

这是一个标准的Windows设计实践。您将在整个操作系统和其他兼容程序中看到它。它不需要任何介意。试图绕过这个重要的用户界面特性只会让你很多愤怒的客户,并导致很多不可维护的代码。 – 2013-04-05 23:07:20