在我的基于mfc对话框的应用程序中,有一个CListCtrl。当用户点击列表控件中的空项时,我需要禁用一个按钮。我使用了NM_CLICK消息并实现了这一点。但是,如果用户将鼠标拖出列表控制区域并释放鼠标,则不起作用。我发现只有在接收按钮消息时才会调用NM_CLICK的原因。是否有任何其他解决方案。
答案 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();
}
它解决了这个问题。谢谢大家的支持。