[API win32] Listbox capricieuse

Résolu
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007 - 13 mars 2006 à 15:05
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007 - 14 mars 2006 à 01:11
Bonjour,
Voila j'ai un souçis avec une listebox, j'espere que quelqu'un pourra m'aider. Moi je n'ai plus d'idées et pourtant y'a rien de plus simple... quelque chose dois m'echapper.
Voila mon but :
J'ai un bouton AJOUTER, SUPPRIMER, UP et DOWN.
Je remplis ma listebox avec des objets Cmp3.
Le programme compile, il ne plante pas, je peux ajouter des mp3, je peux les supprimer. Jusque la tout va bien.
Mais lorsque je veux intervertir deux objets, je fais appel a la fonction UP pour intervertir vers le haut et DOWN vers le bas.
En debugant mes fonctions : mes objets s'intervertssent correctement.
Mais quand je fais appel à update(), ma listebox est censée se détruire et reafficher chaques objets Cmp3.
Lorsque je debug update, tout est normal.
ALORS POURQUOI L'AFFICHAGE NE SE FAIS PAS ? (alors que cette fonction fonctionne avec ajouter et supprimer)
Autre remarque :
Lorsque je fais un UP(), puis un suppr() du mp3 que je viens de monter, il me supprime le bon objet, mais pas le bon affichage puisque ma listebox n'a pas fait de UP().
J'espere que j'etais assez clair, y'a rien de compliqué et la je suis bloqué sur cette bizarerie incomprehensible :(
Voici un peu de code :

if(UPDATE) // mise a jour de la playliste (WINDOWS LOOP)
{
Cplaylist->update() ;
UPDATE = 0 ;
}

//(SWITCH BOUTON)*************************************

case IDC_BUTTON9 : // AJOUTER
Cplaylist->add(Cplaylist->Mp3_Name);
UPDATE = 1 ;
return TRUE ;

/*******************************************************/
case IDC_BUTTON3 : //SUPPRIMER
if(Cplaylist->suppr() <= 0)
MessageBox(Dlg,"Vous devez selectionner un Mp3 a supprimer !",NULL,MB_OK);
else
UPDATE = 1 ;
return TRUE ;

/********************************************************/
case IDC_BUTTON1 : //UP
Cplaylist->up();
UPDATE = 1 ;
return TRUE ;

/********************************************************/
case IDC_BUTTON4 : //DOWN
Cplaylist->down() ;
UPDATE = 1 ;
return TRUE ;

// (PLAYLIST.CPP)******************************************/

int playliste::add(char * nom_mp3)
{
*(Cmp3+nb_mp3) = new mp3 ;
(*(Cmp3+nb_mp3))->set_name(nom_mp3) ; //c public mais spa grv lol
this->nb_mp3++ ;
return (nb_mp3-1) ;
}

/**********************************************************/
int playliste::suppr()
{
// Récupère l'indexe de l'item sélectionner
int SelIndex = SendMessage(hList, LB_GETCURSEL, 0, 0);
if(SelIndex != LB_ERR) // si kkchose est selectionne
{
char del[MAX_PATH] ;
sprintf(del,"%s\\Playlist\\%s",(*(Cmp3+SelIndex))->Chemin,(*(Cmp3+SelIndex))->nom);
DeleteFile(del) ;
int i = 0;
while((SelIndex+i) != (nb_mp3 - 1))
{
memcpy((*(Cmp3+SelIndex+i))->nom, (*(Cmp3+(SelIndex+i+1)))->nom,
MAX_PATH);
memcpy((*(Cmp3+SelIndex+i))->Chemin, (*(Cmp3+(SelIndex+i+1)))->Chemin, MAX_PATH);
(*(Cmp3+SelIndex+i))->LenStart = (*(Cmp3+(SelIndex+i+1)))->LenStart ;
i++;
}
delete *(Cmp3+nb_mp3-1) ;
nb_mp3--;
return 1 ;
}
else
return -1 ;
}

/***********************************************************************/
void playliste::up()
{
char tmpnom[MAX_PATH] ;
char tmppath[MAX_PATH] ;
int tmplen ;
int SelIndex = SendMessage(hList, LB_GETCURSEL, 0, 0);
if(SelIndex != LB_ERR) // si kkchose est selectionne
{
if(SelIndex ! = 0)
{
memcpy(tmpnom, (*(Cmp3+(SelIndex)))->nom, MAX_PATH);
memcpy(tmppath, (*(Cmp3+(SelIndex)))->Chemin, MAX_PATH);
tmplen = (*(Cmp3+(SelIndex)))->LenStart ;

memcpy((*(Cmp3+SelIndex))->nom, (*(Cmp3+(SelIndex-1)))->nom, MAX_PATH);
memcpy((*(Cmp3+SelIndex))->Chemin, (*(Cmp3+(SelIndex-1)))->Chemin, MAX_PATH);
(*(Cmp3+SelIndex))->LenStart = (*(Cmp3+(SelIndex-1)))->LenStart ;

memcpy((*(Cmp3+(SelIndex-1)))->nom,tmpnom, MAX_PATH);
memcpy((*(Cmp3+(SelIndex-1)))->Chemin,tmppath, MAX_PATH);
(*(Cmp3+(SelIndex-1)))->LenStart = tmplen ;
}
}
}

/****************************************************************************/
void playliste::down()
{
char tmpnom[MAX_PATH] ;
char tmppath[MAX_PATH] ;
int tmplen ;
int SelIndex = SendMessage(hList, LB_GETCURSEL, 0, 0);
if(SelIndex != LB_ERR) // si kkchose est selectionne
{
if(SelIndex ! = (nb_mp3-1))
{
memcpy(tmpnom, (*(Cmp3+(SelIndex)))->nom, MAX_PATH);
memcpy(tmppath, (*(Cmp3+(SelIndex)))->Chemin, MAX_PATH);
tmplen = (*(Cmp3+(SelIndex)))->LenStart ;

memcpy((*(Cmp3+SelIndex))->nom, (*(Cmp3+(SelIndex+1)))->nom, MAX_PATH);
memcpy((*(Cmp3+SelIndex))->Chemin, (*(Cmp3+(SelIndex+1)))->Chemin, MAX_PATH);
(*(Cmp3+SelIndex))->LenStart = (*(Cmp3+(SelIndex+1)))->LenStart ;

memcpy((*(Cmp3+(SelIndex+1)))->nom,tmpnom, MAX_PATH);
memcpy((*(Cmp3+(SelIndex+1)))->Chemin,tmppath, MAX_PATH);
(*(Cmp3+(SelIndex+1)))->LenStart = tmplen ;
}
}
}

/********************************************************************************
/********************************************************************************

7 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
13 mars 2006 à 18:28
Salut,

Dans ta fonction update, la variable size doit etre une structure SIZE
(voir msdn sur le dernier param GetTextExtentPoint32). Donc vu que size
n'est pas un int les trucs du genre "size > maxLen" et "maxLen =
size" sont faux.

Au passage, petit memory leak puisque tu oublies de liberer le hDC que tu crée avec GetDC.



Sinon consernant la technique, je pense que supprimer tout les items et les rajouter dans le bon ordre c'est un peu lourd.

Pour faire tes fonctions up et down, il suffit juste d'enlever et de rajouter l'item au bon endroit non ?

3
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007
13 mars 2006 à 15:10
oups j'ai oublié la fonction qui m'embete (seulement pour up et down) :

void playliste::update()
{

SendMessage(hList, LB_RESETCONTENT, NULL, NULL);
for(int i=0 ; i!=nb_mp3 ; i++)
{
if(SendMessage(hList, LB_ADDSTRING, NULL, (LPARAM) (*(Cmp3+i))->nom) == LB_ERR)
exit(-1); // erreur a traiter
HDC hdc = GetDC(NULL);
GetTextExtentPoint32(hdc,(*(Cmp3+i))->nom, strlen((*(Cmp3+i))->nom),(LPSIZE)&size);
if(size > MaxLen)
{
MaxLen = size ;
SendMessage(hList, LB_SETHORIZONTALEXTENT, size, 0);
}
}
}
0
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007
13 mars 2006 à 15:13
burk

void playliste::update()
{
SendMessage(hList, LB_RESETCONTENT, NULL, NULL);
for(int i= 0 ; i!=nb_mp3 ; i++)
{
if(SendMessage(hList, LB_ADDSTRING, NULL, (LPARAM) (*(Cmp3+i))->nom) == LB_ERR)
exit(-1); // erreur a traiter
HDC hdc = GetDC(NULL);
GetTextExtentPoint32(hdc,(*(Cmp3+i))->nom, strlen((*(Cmp3+i))->nom),(LPSIZE)&size);
if(size > MaxLen)
{
MaxLen = size ;
SendMessage(hList, LB_SETHORIZONTALEXTENT, size, 0);
}
}
}
0
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007
13 mars 2006 à 16:51
J'ai du nouveau.
apparament quand lors de l'update la chaine de caractere s'agrandie, j'envois le message suivant qui semble me faire buguer.
SendMessage(hList, LB_SETHORIZONTALEXTENT, size, 0);

A ce moment la, meme si i != nb_mp3, je sors quand meme du for !
Trop fort, lol jamais vu ca.
Il sors du for et il va directement à la ligne au dessus du for ici :
SendMessage(hList, LB_RESETCONTENT, NULL, NULL);
Ca voudrais dire qu'il relance la fonction update ?!
...tres bizare !

Peut etre une reference a une fonction update() dans la fonction sendmessage mais m'etonnerais... ou alors c dans les threads windows ke ca merdouille :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007
13 mars 2006 à 17:16
Bon j'ai resolu ce dernier bug bizare en fesant le SETHORIZONTALEXTENT en dehors de la fonction update, mais mon probleme ne venais pas de ca...
mon break pas à pas fait tout ce que je veux, mes variables contiennent tout ce que je veux. Pas d'erreur renvoyées par les SendMessage... je suis au bord du suicide, j'aurais du poster dans Au secours
C'est la premiere fois que je bloque autant sur un truc qui devrais etre pourtant simple et qui l'etait jusqu'au codage de up() et donw() :S
Si je resouds pas ca, je ne touche plus a cette api et je m'en cree une entierement en glut lol. (s'il fo reinventer la roue...grrr)
0
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007
13 mars 2006 à 19:31
salut
Pour le size j'aurais bien aimé utiliser la struct SIZE mais mon compilo ne connais pas le type SIZE alors j'ai mis int et j'ai vu que ca marchais et les valeurs semblent correctes.
C'est dans quel point H ?
Ensuite pour GetDC, j'ai rajouté ReleaseDC(NULL, hdc); , c'est bien comme ca ? (premiere fois que je passe NULL a GetDC)
Sinon pour la technique en fait je m'occupe d'abord de ma liste d'objet mp3 et ensuite je gere son affichage donc le plus rapide pour moi ct un deletecontent puis une simple recopie de mon tableau d'objets mp3 mais je ferais comme tu dis si vraiment je n'arrive pas a resoudre ce probleme. Ce qui m'irisse c'est surtout que ca marche nikel pour ajout et suppr et ca m'embete d'utiliser une autre technique tant que je n'aurais pas compris pourquoi il me fais ça ce grrrrrrrrrrrrrrrrrrrrredin !
0
JoebarGlut Messages postés 111 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 17 octobre 2007
14 mars 2006 à 01:11
Bon en fait j'ai utilisé ta technique et ca fonctionne nikel :)
J'aurais bien aimé savoir pour l'autre mais tans pis, je m'en vais avec une lacune qui viendra m'achever un autre jour...
merci pour l'aide ;)
0
Rejoignez-nous