0

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

4

4 回答 4

1

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

这完全是设计使然,您不应该希望这些点击“计数”。这是用户在点击过程中改变主意的唯一方法。它是这样工作的:

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

您会注意到,在 Windows 中,直到释放鼠标按钮(通常称为“MouseUp”)才会发生操作。如果不支持这一点,用户将无法提前退出操作,这是任何用户界面的关键特性。

于 2013-04-05T06:24:05.587 回答
0

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

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

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

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

static CWnd* PASCAL WindowFromPoint(POINT point);

比如一个 OnMouseMove,如果你使用这个函数,你可以检查窗口是否被鼠标指向。

于 2013-04-05T02:15:45.700 回答
0

实现一个 LVN_ITEMCHANGED 处理程序,并在该处理程序中,一旦所选项目计数为零,就禁用该按钮。

于 2013-04-05T06:12:28.500 回答
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( .... )

{

更新按钮();

}

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

于 2013-04-08T08:20:52.040 回答