Ctreectrl amélioré

Description

/*
TreeMultiEx :

- Gestion de la multiselection
- Gestion de la couleur d'écriture de chaque item
- Gestion de la couleur de fond et de celle du texte
des items selectionnés (pour tous les items)
- Gestion de la font des items (gras, italique, souligné, taille) pour chaques items
- Gestion du deplacement des items dans la liste (Up/Down) avec
mémorisation du déroullement de chaque node de l'arbre
- Suppression de chaques item avec leur sous item et les data assosier a chacun d'eux
- Gestion de la copy de branches vers un autre TreeMultiEx
- Numerotation de la position de chaque item dans sa branche
- Tri par position de chaque items quand il sont ajouter
  • /

Source / Exemple :


//-----------------------------------------------
class CTreeMultiEx : public CTreeCtrl
{
// Construction
public:
	CTreeMultiEx();

	//Efface la selection
	void ClearSelection();

	//Selection tous les items entre les 2 items en param
	BOOL SelectItems(HTREEITEM hItemFrom, HTREEITEM hItemTo);

	//Ajoute un item a la liste 
	HTREEITEM AddItem(TreeItemEx hItemEx, HTREEITEM hFatherItem = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
	HTREEITEM AddItem(CString strText,HTREEITEM hFatherItem = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST
					  ,COLORREF crCoul = RGB(0,0,0),int iPos = 0, void * pData = NULL);

	//Pour la multiselection
	//Même utilisation qu'avec un CListCtrl
	HTREEITEM GetFirstSelectedItem();
	HTREEITEM GetNextSelectedItem( HTREEITEM hItem );
	HTREEITEM GetPrevSelectedItem( HTREEITEM hItem );

	//Permet de choisir la couleur d'un item
	void SetItemCoul(HTREEITEM hItem, COLORREF crCoul = RGB(0,0,0));

	//Retourne la couleur de l'item en param
	COLORREF GetItemCoul(HTREEITEM hItem) const;

	//Permet de choisir la couleur du texte pour les items sélectionnés
	void SetSelTextCoul( COLORREF crCoul = RGB(255,255,255) /*Blanc*/);

	//Permet de choisir la couleur du fond pour les items sélectionnés
	void SetSelBkCoul( COLORREF crCoul = RGB(0,100,200) /*Bleu std*/);

	//Permet de choisir la couleur de fond
	ULONG SetBkColor(COLORREF crCoul);
	
	//Permet de choisir la fonte d'un item
	void SetItemFont(HTREEITEM hItem,bool bItalic = false, bool bBold = false
									,bool bUnderline = false, int iHeight = -1);

	//Idem mais avec une struct LOGFONT
	void SetItemFont(HTREEITEM hItem, LOGFONT font);

	//Retourne la fonte de l'item en param
	LOGFONT GetItemFont(HTREEITEM hItem) const;

	//Supprime l'item em param et tous ces fils si il y en a
	//Supprime les ref a l'item est ces fils dans les maps
	//Supprime les item data de lui est ces fils si bKillData = true
	//KillOnlyChild detruit seulement les enfants de l'item
	BOOL DeleteItem(HTREEITEM hItem, bool bKillData = false, bool bKillOnlyChild = false);

	//Supprime tous les items selectionnés
	BOOL DeleteAllSelectedItems(bool bKillData = false);

	//Idem que la fct original sauf qu'elle retourne TVI_ROOT
	//si le père d'un item et la racine (au lieu de NULL)
	//Elle retourne une struct TreeItemEx avec tutes les infos sur l'item
	TreeItemEx GetParentItem(HTREEITEM hItem) const;

	//Retourne un vecteur contenant le TreeItemEx de tous les pere de 
	//l'item en cour (le dernier est bien sur TVI_ROOT)
	std::vector<TreeItemEx> GetAllParentItem(HTREEITEM hItem) const;

	//Si bRespect = true, le deroulement des branche sera 
	//respecter lors de l'utilisation de up/down si non
	//toute les branches seront fermés a chaque fois
	void RespectNodeExpand(bool bRespect = true);

	//Si bShow = true affiche la position de l'item en 
	//plus de son texte ([Pos] Texte)
	void ShowPos(bool bShow = true);
	bool bIsVisiblePos() const { return m_bShowPos;}

	//Permet de faire monter (ou descendre un item ds la liste)
	//Si plusieurs items sont selectionnés seul le premier sera déplacer
	//Si hItem = Null alors deplace le 1er item est selectionné
	//Affiche un msgbox si hItem = NULL et pas de selection
	bool UpItem(HTREEITEM hItem = NULL);
	bool DownItem(HTREEITEM hItem = NULL);

	//Permet de savoir si un item est derouler ou  pas
	bool bIsExpandedItem(HTREEITEM hItem) const;

	//Permet de choisir le tree associer
	void SetLinkedTree(CTreeMultiEx * pTree);

	//Ajout l'item est tous ces fils au tree defint par SetLinkedTree
	//hLinkedTreeFatherItem sert a définir quel sera le pere des items a ajouter
	//dans le tree Linker
	//ATTENTION : Pour que cette fct fonctionne correctement
	//il faut que les 2 tree soit linker entre eux (fct SetLinkedTree)
	bool AddToLinkedTree(const HTREEITEM hItem, HTREEITEM hLinkedTreeFatherItem = TVI_ROOT,
						bool bDeleteAfterCopy = false, bool bAddFatherItem = false);

	//Retourne un ptr sur la map contenant pour chaques items sa position dans sa node
	const CMap< HTREEITEM, HTREEITEM, int, int&> * GetAllItemsPos();

	//Retourne un ptr sur la map contenant pour chaque items les data assosiées
	const CList<TreeItemEx,TreeItemEx>  * GetDataList();

	//Retourne toute la struct TreeItemEx
	TreeItemEx * GetItemExData(HTREEITEM hItem) const;
	
	//Retourne seulement les data de l'item (Comme la version originale)
	//C'est a dire le pData de la struct TreeItemEx
	DWORD GetItemData(HTREEITEM hItem) const;

	//Idem que la fct originale
	int SetItemData(HTREEITEM hItem, DWORD dwData);

	//Met le flag de trie des item a vrai
	//Les items  sont trier un fois si bSort = true puis 
	//ils seront retrié a chaque addItem tant que m_bSortByPos = true
	void SetSortByPos(bool bSort = true);

	//Trie les items en fct de leur position
	//Ne trie que les item dont le pere et hParent
	bool SortByPos(HTREEITEM hParent = TVI_ROOT);

	void SetLinkOfItem(HTREEITEM hThisTreeItem, HTREEITEM hLinkedTreeItem);

Conclusion :


Voila ya une petite appli dans le zip pour expliquer

bugs connus :

-Dans le up/Dwn les pères des items sont parfois perdu
-Quelques bugs dans la fct AddToLinkedTree
(certain items refuse de s'ajouter ou de ce supprimer)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.