Щелчок мышью в области без элементов 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);
}
Другие вопросы по тегам