鼠标单击CListBox

时间:2017-06-08 19:06:46

标签: mfc clistbox

我想知道用户何时点击了CListBox,但是在任何项目之外。我希望在包含对话框中获得一些通知,这样我就可以通过mylistbox.ItemFromPoint(flags,outside)处理该点以确定它是否在项目中。但是列表框中的点击似乎不会导致此类事件。我应该在父对话框中查找哪些事件,以及需要设置哪些事件才能启用它?我真的不在乎是点击还是只是嘲笑。

我的目的是,如果用户点击任何项目之外的mylistbox.SetCurSel(-1),则取消选中所有项目。

附录:这是按照@mercurydime的建议实现的完整代码。

(标题)

#ifndef INCLUDE_CMYLISTBOX_H
#define INCLUDE_CMYLISTBOX_H

class CMyListBox : public CListBox
{
public:

    CMyListBox();

    void                allow_deselect( bool allow = true );

protected:

    bool                m_allow_deselect;

    afx_msg void        OnLButtonDown( UINT flags, CPoint point );

    DECLARE_MESSAGE_MAP()
};

#endif  //  INCLUDE_CMYLISTBOX_H

(身体)

#include "stdafx.h"
#include "CMyListBox.h"

CMyListBox::CMyListBox()
    : CListBox(), m_allow_deselect( false )
{
}

void CMyListBox::allow_deselect( bool allow )
{
    m_allow_deselect = allow;
}

BEGIN_MESSAGE_MAP( CMyListBox, CListBox )
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

void CMyListBox::OnLButtonDown( UINT flags, CPoint point )
{
    if( m_allow_deselect )
    {
        BOOL outside( TRUE );
        ItemFromPoint( point, outside );

        if( outside )
            SetCurSel( -1 );
    }

    CListBox::OnLButtonDown( flags, point );
}

1 个答案:

答案 0 :(得分:1)

1)使用类向导创建一个派生自CListBox的类:

  • CTRL + SHIFT + X

  • 点击添加课程按钮

  • 上的向下箭头
  • 选择 MFC类菜单项

  • 确保基类设置为 CListBox

2)为WM_LBUTTONDOWN添加消息处理程序

  • CTRL + SHIFT + X

  • 点击消息标签

  • 双击 WM_LBUTTONDOWN

3)在处理程序

中添加ItemFromPoint代码
<soap12:address location="http://localhost:8080/dataRecovery/services"/>