gatorette a écrit :
Pas besoin de modifier la méthode SortItems ! En effet, cette méthode accepte une fonction en paramètre. A toi de te débrouiller pour implémenter cette fonction correctement. Il faut juste trouver un moyen de trier en fonction de la donnée associée à chaque item (voir SetItemData/GetItemData).
On peut imaginer que tu stockes dans la donnée associée à chaque item la valeur de l'item pour les items "standards" (en renvoyant 'lParam1 - lParam2') et peut être un flag pour indiquer que c'est une description.
On aurait ainsi :
Code :
- #define DESCRIPTION_MASK 0x80000000
- item | texte | lParam
- 1 | "14" | 14
- 2 | "description1" | (14 | DESCRIPTION_MASK)
- 3 | "27" | 27
- 4 | "13" | 13
- 5 | "06" | 6
- 6 | "description2" | (6 | DESCRIPTION_MASK)
- 7 | "09" | 9
- int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
- {
- int res = (lParam1 ^ DESCRIPTION_MASK) - (lParam2 ^ DESCRIPTION_MASK); // compare les deux paramètres sans le masque
- if( res == 0 ) // si les deux params étaient égaux
- { // un des deux doit être la description
- if( (lParam1 & DESCRIPTION_MASK) == DESCRIPTION_MASK )
- res = 1; // si c'est lParam1, je le met après
- else
- res = -1; // sinon, je met lParam1 avant
- }
- return res;
- }
|
J'ai pas fait de tests, mais j'imagine que ça doit marcher. C'est une approche qui a l'avantage d'être assez rapide (la fonction de tri est simple), mais qui n'utilise le lParam que pour le tri et tu ne peux pas utiliser le bit DESCRIPTION_MASK dans tes valeurs. Si les inconvénients sont trop importants, il reste la solution d'affecter à lParam un pointeur vers une structure et là tu peut faire ce que tu veux.
|