2017-06-08 4 views
1

Ich möchte wissen, wenn der Benutzer in einer CListBox geklickt hat, aber außerhalb eines beliebigen Elements. Ich hatte gehofft, eine Benachrichtigung in dem enthaltenden Dialog zu erhalten, damit ich den Punkt verarbeiten kann, um festzustellen, ob es in einem Artikel über mylistbox.ItemFromPoint(flags,outside) ist. Klicks innerhalb der Listbox scheinen jedoch nicht zu solchen Ereignissen zu führen. Welches Ereignis sollte ich im übergeordneten Dialog suchen, und was muss eingerichtet werden, um es zu aktivieren? Es ist mir wirklich egal, ob es ein Klick oder nur ein Mausklick ist.Mausklick in Nicht-Objektbereich von CListBox

Mein Zweck ist es, alle Elemente abzuwählen, wenn der Benutzer außerhalb eines Elements klickt, mit mylistbox.SetCurSel(-1).


Nachtrag: Dies ist der vollständige Code für die Klasse implementiert, wie durch @mercurydime vorgeschlagen.

(Header)

#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 

(Körper)

#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); 
} 

Antwort

1

1) Verwenden Sie den Klassen-Assistenten eine Klasse von CListBox abgeleitet zu erstellen:

  • Ctrl + Umschalt + X

  • Klicken Sie auf den Pfeil nach unten auf der Klasse hinzufügen Taste

  • die

  • Sicherstellen, dass die Basisklasse CListBox gesetzt

    Menüpunkt MFC Klasse Wählen

2) Fügen Sie einen Meldungshandler für WM_LBUTTONDOWN

hinzu
  • Strg + Umschalt + X

  • klicken, um die Nachrichten Registerkarte

  • Doppelklick WM_LBUTTONDOWN

3) Fügen Sie Ihre ItemFromPoint Code innerhalb des Handlers

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

    if (bOutside) 
    { 
     // do whatever 
    } 

    CListBox::OnLButtonDown(nFlags, point); 
} 
+0

Okay, ich akzeptiere diesen Ansatz. Ich hatte gehofft, es vom Elternteil zu machen, ohne das Steuerelement zu unterklassifizieren, aber da ich bereits Cstatatic und CComboBox unterklassiere, warum nicht? Dies wird mich später auch andere Verbesserungen machen lassen. +1 für den Vorschlag. – MPW

+0

Ich habe den vollständigen Code für die implementierte Klasse zu meiner ursprünglichen Frage hinzugefügt. Danke noch einmal. – MPW