Щелчок мышью в области без элементов CListBox
Я хочу знать, когда пользователь щелкнул в CListBox, но за пределами любого элемента. Я надеялся получить какое-то уведомление в содержащем диалог, чтобы я мог обработать точку, чтобы определить, находится ли она внутри элемента через mylistbox.ItemFromPoint(flags,outside)
, Но щелчки в списке не приводят к таким событиям. Какое событие мне нужно искать в родительском диалоге, и что нужно настроить, чтобы включить его? Мне действительно все равно, если это щелчок или просто mousedown.
Моя цель для этого состоит в том, чтобы отменить выбор всех элементов, если пользователь нажимает за пределами любого элемента, с 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
(Body)
#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 ответ
1) Используйте мастер классов, чтобы создать класс, производный от CListBox:
Ctrl + Shift + X
Нажмите стрелку вниз на кнопке Добавить класс
Выберите пункт меню MFC Class
Убедитесь, что базовый класс установлен в 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);
}