2008-12-19 36 views
3

Je viens d'ajouter l'un des nouveaux contrôles CVSListBox (MFC Feature Pack) à un projet. La liste des éléments dans le contrôle est suivie par d'autres objets dans mon application, donc j'ai besoin de prendre beaucoup de notifications de la zone de liste quand quelque chose change pour que je puisse mettre à jour d'autres choses. Pour ceux qui ne connaissent pas le contrôle, il y a une barre de boutons qui offre une fonctionnalité de base ajouter/supprimer/réorganiser. Le contrôle CVSListBox offre des fonctions virtuelles remplaçables pour des choses comme l'ajout ou le changement de nom d'éléments, et le changement de leur ordre - tout cela fonctionne bien. Cependant, pour supprimer des éléments, le seul remplacement est OnBeforeRemoveItem, qui est appelé AVANT qu'un élément ne soit supprimé, et à partir duquel il faut retourner TRUE/FALSE pour autoriser la suppression. Une fois la suppression effectuée, il n'y a pas de notification spécifique.Notification CVSListBox après la suppression

Quelle est la meilleure façon d'obtenir une notification après une suppression? De toute évidence, il est possible de pirater quelque chose d'horrible ici, car il y aura un événement de sélection après un retrait, et il serait possible de tenir un drapeau de l'avant-supprimer pour dire que la sélection suivante est modifiée spécial. Mais j'ai l'impression qu'il me manque quelque chose de plus propre et de plus évident. Aucune suggestion?

Répondre

1

En supposant que l'élément sera vraiment retiré à chaque fois, vous pouvez soit:

  • Est-ce que la manipulation de la dérogation OnBeforeRemoveItem comme si le point a déjà été retiré
  • Raise votre propre événement OnAfterItemRemoved
  • Voyez si vous pouvez obtenir un contrôle sur le contrôle de liste sous-jacente (quel qu'il soit) et accrocher un de ses événements
0

Essayez quelque chose comme ceci:

class my_lbox : public CVSListBox 
{ 
    protected: 

     BOOL OnBeforeRemoveItem(int what_item) 
     { 
      CString txt = GetItemText(what_item); 
      DWORD_PTR idata = GetItemData(what_item); 

      if(true) //up to you to check if this item can be removed 
      { 
       OnAfterRemoveItem(txt,idata); 
       return TRUE; 
      } 
      return FALSE; 
     } 

     void OnAfterRemoveItem(const CString& txt, DWORD_PTR idata) 
     { 
      CString info; 
      info.Format(L"Removing item:'%s'",txt); 

      MessageBox(info); 
     } 
}; 

Espérons que cela aide.

Questions connexes