鼠标点击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 );
}
- 使用 Class 向导 创建从
CListBox
: 派生的 class
Ctrl+Shift+X
单击 添加 Class 按钮上的向下箭头
Select MFC Class 菜单项
确保基数 class 设置为 CListBox
- 为
WM_LBUTTONDOWN
添加消息处理程序
Ctrl+Shift+X
单击消息 选项卡
双击WM_LBUTTONDOWN
- 在处理程序中添加您的
ItemFromPoint
代码
void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
BOOL bOutside = TRUE;
UINT uItem = ItemFromPoint(point, bOutside);
if (bOutside)
{
// do whatever
}
CListBox::OnLButtonDown(nFlags, point);
}
我想知道用户何时在 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 );
}
- 使用 Class 向导 创建从
CListBox
: 派生的 class
Ctrl+Shift+X
单击 添加 Class 按钮上的向下箭头
Select MFC Class 菜单项
确保基数 class 设置为
CListBox
- 为
WM_LBUTTONDOWN
添加消息处理程序
Ctrl+Shift+X
单击消息 选项卡
双击
WM_LBUTTONDOWN
- 在处理程序中添加您的
ItemFromPoint
代码
void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
BOOL bOutside = TRUE;
UINT uItem = ItemFromPoint(point, bOutside);
if (bOutside)
{
// do whatever
}
CListBox::OnLButtonDown(nFlags, point);
}