在我的基于 mfc 对话框的应用程序中,有一个 CListCtrl。当用户单击列表控件中的空项目时,我需要禁用按钮。我使用 NM_CLICK 消息并实现了这一点。但是如果用户将鼠标拖出列表控制区域并释放鼠标,这将不起作用。我找到了 NM_CLICK 仅在接收到按钮向上消息时才会被调用的原因。是否有其他解决方案。
4 回答
但是如果用户将鼠标拖出列表控制区域并释放鼠标,这将不起作用。
这完全是设计使然,您不应该希望这些点击“计数”。这是用户在点击过程中改变主意的唯一方法。它是这样工作的:
- 开始单击列表框控件中的对象(或空白区域)
- 改变你的想法
- 在仍然按住鼠标按钮的同时(即在提交单击之前),将鼠标指针拖动到控件边界之外
- 想想:哇!那是一个接近的电话!
您会注意到,在 Windows 中,直到释放鼠标按钮(通常称为“MouseUp”)才会发生操作。如果不支持这一点,用户将无法提前退出操作,这是任何用户界面的关键特性。
有一些可行的选择。在父对话框中,MouseUp 处理函数可以用于此。
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
使用point可以检查CListCtrl是否发生了鼠标释放。如果是,您只需禁用该按钮。
此外,WindowFromPoint 可以是另一种选择。
static CWnd* PASCAL WindowFromPoint(POINT point);
比如一个 OnMouseMove,如果你使用这个函数,你可以检查窗口是否被鼠标指向。
实现一个 LVN_ITEMCHANGED 处理程序,并在该处理程序中,一旦所选项目计数为零,就禁用该按钮。
我找到了问题的解决方案。如果用户使用左键拖动鼠标,则可以处理一条消息,即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( .... )
{
更新按钮();
}
它解决了这个问题。谢谢大家的支持。