[API C++] plantage du senddlgitemmessage(..)

plantage du senddlgitemmessage(..) [API C++] - C++ - Programmation

Marsh Posté le 11-05-2006 à 11:14:25    

Bonjour à tous, :bounce:  
 
J'ai réalisé un programme sous DEV C++ 4.9.9.2
Celui ci est composé d'une fenetre principale (IDR_MAIN) et de 3 sous-fenetre ; un treeview, une listbox, et un champ edit créés de la manière suivante :

Code :
  1. hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT","", WS_CHILD | WS_VISIBLE | ES_NUMBER,492 ,0, 25, 25, hwnd, (HMENU)ID_EDIT_PROFONDEUR, GetModuleHandle(NULL),NULL);
  2.  
  3. hTreeView = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW,"TreeView",
  4.                       WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_HASBUTTONS ,
  5.                       0 ,51, 200, BAS_FENETRE-115, hwnd, (HMENU)IDR_ARBRE, GetModuleHandle(NULL),NULL);
  6.              
  7. hListResultat = CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX","", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LBS_NOSEL | LBS_DISABLENOSCROLL | LBS_OWNERDRAWFIXED,201,26, 500,BAS_FENETRE-95, hwnd, (HMENU)ID_LISTRESULTAT, GetModuleHandle(NULL),NULL);


Le principe du prog est le suivant : il recherche le terme tapé dans le champs Edit dans unfichier text et affiche les lignes  contenant ce terme dans la list box. le treeview permettant de sélectionner certaines lignes. Chaque clic sur le treeview lance un :
 

Code :
  1. SendDlgItemMessage(hwnd, ID_LISTRESULTAT, LB_RESETCONTENT, 0, 0);


 afin de reinitialiser la listbox.
 
tout se passe passe bien sauf que si je clique sur la list box puis directement sur le champs treeview ca plante (avec le message d'erreur windows qui propose d'envoyer l'erreur a microsoft etc).  :sweat:  
Toutes les autres succession de clic possibles marchent bien.
Si je ne lance pas le message d'effacement cela ne plante pas.
 
Quelqu'un a t il une idée ?  :love:  
Merci.

Reply

Marsh Posté le 11-05-2006 à 11:14:25   

Reply

Marsh Posté le 11-05-2006 à 11:18:57    

debugger pas à pas et vérifier les valeurs une à une ?

Reply

Marsh Posté le 11-05-2006 à 11:57:58    

Trouvé !!  :bounce:  
 
Le problème venait de la perte du focus apparement, en effet la listbox est crée avec l'option LBS_OWNERDRAWEDFIXED, cette option utilisé avec le code suivant :
 

Code :
  1. // case DRAWITEM         
  2.     case WM_DRAWITEM :
  3.          {
  4.           LPDRAWITEMSTRUCT info = (LPDRAWITEMSTRUCT)lParam;
  5.           StringCouleur* sc = (StringCouleur*)info->itemData;
  6.        
  7.           switch (info->itemAction)
  8.                {
  9.                   case ODA_DRAWENTIRE:
  10.                       if (sc->couleur == 2)
  11.                            SetTextColor(info->hDC, RGB(255,0,0));
  12.                        else
  13.                            SetTextColor(info->hDC, RGB(0,0,0));
  14.                        break;
  15.                   case ODA_FOCUS :
  16.                        if (sc->couleur == 2)
  17.                           SetTextColor(info->hDC, RGB(255,0,0));
  18.                        else
  19.                            SetTextColor(info->hDC, RGB(0,0,0));
  20.                        break;
  21.                   default :
  22.                        if (sc->couleur == 2)
  23.                           SetTextColor(info->hDC, RGB(255,0,0));
  24.                        else
  25.                            SetTextColor(info->hDC, RGB(0,0,0));
  26.                        break;
  27.                }
  28.            DrawText(info->hDC,sc->str.c_str(), -1, &info->rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
  29.         }
  30.     break;


 
Permettant de changer le code de couleur. Ceci étant appelé a chaque affichage (et donc apres chaque reinitialisation de la liste)
Le fait de cliquer sur la list box faisait perdre le focus, ce qui apparement l'empechait de remplir correctement la variable info provoquant ainsi une erreur de segmentation ( :pfff: ).
 
Donc pour résoudre le problème j'ai ajouté l'instruction  SetFocus(hwnd) avant chaque appel du SendDlgItemMessage.
 
Voilou   :lol:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed