Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1194 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1364063
Alban44
Posté le 11-05-2006 à 11:14:25  profilanswer
 

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.

mood
Publicité
Posté le 11-05-2006 à 11:14:25  profilanswer
 

n°1364068
_darkalt3_
Proctopathe
Posté le 11-05-2006 à 11:18:57  profilanswer
 

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

n°1364116
Alban44
Posté le 11-05-2006 à 11:57:58  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
API win32 + logiciel réseauProblème avec IE, (plantage complet sur mon site)
[API windows]CheckBox[C] Plantage incompréhensible...
Plantage GlobalAlloc() dans VB6API de Jack
plantage lors de l'exécution (un seul cas de figure)API Icalendar
API Google en JavaUsage de libavcodec ou autre API multimedia
Plus de sujets relatifs à : [API C++] plantage du senddlgitemmessage(..)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR