鼠标点击CListBox的非item区域

Mouse click in non-item area of CListBox

我想知道用户何时在 CListBox 中单击,但在任何项目之外单击。我希望在包含的对话框中得到一些通知,以便我可以通过 mylistbox.ItemFromPoint(flags,outside) 处理该点以确定它是否在项目内。但是在列表框中单击似乎不会导致此类事件。我应该在父对话框中寻找什么事件,需要设置什么来启用它?我真的不在乎是单击还是鼠标按下。

我这样做的目的是在用户点击任何项目之外时取消选择所有项目,mylistbox.SetCurSel(-1)


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

(页眉)

#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. 使用 Class 向导 创建从 CListBox:
  2. 派生的 class
  • Ctrl+Shift+X

  • 单击 添加 Class 按钮上的向下箭头

  • Select MFC Class 菜单项

  • 确保基数 class 设置为 CListBox

  1. WM_LBUTTONDOWN
  2. 添加消息处理程序
  • Ctrl+Shift+X

  • 单击消息 选项卡

  • 双击WM_LBUTTONDOWN

  1. 在处理程序中添加您的 ItemFromPoint 代码
void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
    BOOL bOutside = TRUE;
    UINT uItem = ItemFromPoint(point, bOutside);

    if (bOutside)
    {
        // do whatever
    }

    CListBox::OnLButtonDown(nFlags, point);
}