Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mfc 在CListBox的非项目区域中单击鼠标_Mfc_Clistbox - Fatal编程技术网

Mfc 在CListBox的非项目区域中单击鼠标

Mfc 在CListBox的非项目区域中单击鼠标,mfc,clistbox,Mfc,Clistbox,我想知道用户何时在CListBox中单击,但在任何项目之外。我希望在包含对话框中得到一些通知,以便通过mylistbox.ItemFromPoint(标志,外部)处理该点以确定它是否在项目内部。但在列表框中单击似乎不会导致此类事件。我应该在父对话框中查找什么事件,需要设置什么来启用它?我真的不在乎它是点击还是鼠标向下 我这样做的目的是,如果用户使用mylistbox.SetCurSel(-1)在任何项目之外单击,则取消选择所有项目 附录:这是@mercurydime建议实现的类的完整代码 (标

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

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


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

(标题)

(正文)

1) 使用类向导创建从CListBox派生的类:

  • Ctrl+Shift+X

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

  • 选择MFC类菜单项

  • 确保基类设置为CListBox

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

  • Ctrl+Shift+X

  • 单击消息选项卡

  • 双击WM_LBUTTONDOWN

3) 在处理程序中添加ItemFromPoint代码

void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
    BOOL bOutside = TRUE;
    UINT uItem = ItemFromPoint(point, bOutside);

    if (bOutside)
    {
        // do whatever
    }

    CListBox::OnLButtonDown(nFlags, point);
}

好吧,我接受这个方法。我希望在不子类化控件的情况下从父级进行操作,但是既然我已经子类化了CStatic和Cmbobox,为什么不呢?这将让我以后做其他调整+我在原始问题中添加了实现类的完整代码。再次感谢。
#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 );
}
void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
    BOOL bOutside = TRUE;
    UINT uItem = ItemFromPoint(point, bOutside);

    if (bOutside)
    {
        // do whatever
    }

    CListBox::OnLButtonDown(nFlags, point);
}