Probleme WS_TABSTOP

fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008 - 30 mai 2007 à 09:32
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008 - 4 juin 2007 à 09:18
Bonjour,
Je mets bien WS_TABSTOP pour tous les composants créé (CreateWIndowEx... )
et j'ai rajouté a la fin,
 while (GetMessage(&msg, NULL, 0, 0) > 0)
 {
  if (IsDialogMessage(hWnd, &msg) == 0)
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 } 
mais rien n'y fait, le curseur ne veut pas passer d'un controle a l'autre!
Help SVP, les autres réponses à ce genre de question ont été résolues justement gràce à IsDialogMessage(), donc pourquoi pas moi?

7 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
31 mai 2007 à 00:37
Tu peux nous montrer ton code avant cette boucle des messages?
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
31 mai 2007 à 09:01
je m'explique avant le code : je crée mes controles en fonction d'un code décrivant la page a afficher
Exemple : 
   EIxyclh<edit1<0<3<coucou<20<15
veut dire que je dois créer une EditBox, référencée par edit1, puis l'abscisse,l'ordonnée, le contenu affiché et la largeur et la hauteur.
AInsi de suite, je peux avoir 20 lignes et donc afficher 20 composants : editbox, bouton, listbox et libellé (static).

J'ai donc créer une boucle qui crée un composant pour chaque ligne,et donc des tableaux de bouton, listbox, edit etc...
J'espere que cette explication te permettre de mieux comprendre le peu de code que je met si apres :
#include "stdafx.h"
#include ... //les autres fichiers pour notamment "parser" le code avec les composants


HWND hWnd;
HWND hBtn[20];
HWND hEdit[20];
HWND hLib[20];
HWND hTab[20];

HBRUSH couleurFond[20];
COLORREF couleurFondTexte[20];
COLORREF couleurTexte[20];


HWND boutonPourFocus;
int ligneTableFocus= 0;


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
 int wmId, wmEvent;
 PAINTSTRUCT ps;


// WCHAR *Text;
  switch (message) 
  {
   case WM_CTLCOLOREDIT://Dessin du contrôle EDIT  //ces CTLCOLOR qui suivent fonctionnent 
   {
    for(int i =0;i<GetNombreComposant();i++)
    {
     if (((HWND)lParam==hEdit[i]))
     {
      SetTextColor((HDC)wParam,couleurTexte[i]);
      SetBkColor((HDC)wParam,couleurFondTexte[i]);
      return (BOOL) couleurFond[i];
     }
    }
    return 0;
   }
   case WM_CTLCOLORSTATIC://Dessin du contrôle LIB
   {
    for(int i=0;i<GetNombreComposant();i++)
    {
     if (((HWND)lParam==hLib[i]))
     {
      SetTextColor((HDC)wParam,couleurTexte[i]);
      SetBkColor((HDC)wParam,couleurFondTexte[i]);
      return (BOOL) couleurFond[i];
     }
     if (((HWND)lParam==hTab[i]))
     {
      SetTextColor((HDC)wParam,couleurTexte[i]);
      SetBkColor((HDC)wParam,couleurFondTexte[i]);
      return (BOOL) couleurFond[i];
     }
    }
    return 0;
   }
   case WM_CTLCOLORLISTBOX://Dessin du contrôle TAB
   {
    for(int i=0;i<GetNombreComposant();i++)
    {  
     if ((HWND)lParam==hTab[i])
     {
      SetTextColor((HDC)wParam,couleurTexte[i]);
      SetBkColor((HDC)wParam,couleurFondTexte[i]);
      return (BOOL) couleurFond[i];
     }
    }   
    return 0;
   }
   case WM_CTLCOLORBTN://Dessin du contrôle BTN
   {
    for(int i=0;i<GetNombreComposant();i++)
    {
     if (((HWND)lParam==hBtn[i]))// &amp;&amp; hBtn[i]!=NULL)
     {
      SetTextColor((HDC)wParam,couleurTexte[i]);
      SetBkColor((HDC)wParam,couleurFondTexte[i]);
      return (BOOL) couleurFond[i];
     } 
    }
    return 0;
   }


   case WM_COMMAND:
   wmId    = LOWORD(wParam); 
   wmEvent = HIWORD(wParam); 
      
   switch (wmId)
   {
    case ID_BUTTON:    
     //   code a implementer
     break;
    default:
     return DefWindowProc(hWnd, message, wParam, lParam);
   }
   break;
   
   case WM_CREATE:
    break;
   case WM_PAINT:
    RECT rt;
    hdc = BeginPaint(hWnd, &amp;ps);
    GetClientRect(hWnd, &amp;rt);
    FillRect(hdc, &amp;rt, (HBRUSH) (1));
    EndPaint(hWnd, &amp;ps);
    break;
   case WM_DESTROY:
    DestroyWindow(hWnd);
    PostQuitMessage(0);
    break;
   default:
    return DefWindowProc(hWnd, message, wParam, lParam);
  }   
// }
 return 0;
}


ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{  // je te l'enleve pour gagner de la place}


int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
  MSG msg;


  MyRegisterClass(hInstance, TEXT("szWindowClass"));
  hWnd = CreateWindow(TEXT("szWindowClass"), TEXT(""),  WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,  NULL,  NULL, hInstance, NULL);
  if (!hWnd)
  {    return FALSE;  }
 LancerParsing();
// MessageBox(NULL, TEXT("Parsing ok"),TEXT("Parsing ok"), MB_OK);
 for(int i=0;i<GetNombreComposant();i++)
 {
  if(strncmp(GetTableauDescription(i),"B",1)==0)
  {
   hBtn[i] = CreateWindowEx(
    0,
    TEXT("BUTTON"),
    ConvertAnsiToUnicode(GetContenu(i)),
    WS_VISIBLE | WS_BORDER | WS_TABSTOP| WS_CHILD,
    atoi(GetAbscisse(i)),
    atoi(GetOrdonnee(i)),
    atoi(GetLargeur(i,"B")),
    atoi(GetHauteur(i,"B")),
    hWnd,
    HMENU(GetIdentifiantUnivoque(i)),
    hInstance,
    NULL);
   if(GetFocalisation(i)!=NULL)
   {
    boutonPourFocus=hBtn[i];
   }
  }
  else
  {
   hBtn[i]=NULL;
  }
  if(strncmp(GetTableauDescription(i),"E",1)==0)
  {
   hEdit[i] = CreateWindowEx(
    0,
    TEXT("EDIT"),
    ConvertAnsiToUnicode(GetContenu(i)),
    WS_VISIBLE | WS_BORDER | WS_TABSTOP | WS_CHILD,
    atoi(GetAbscisse(i)),
    atoi(GetOrdonnee(i)),
    atoi(GetLargeur(i,"E")),
    atoi(GetHauteur(i,"E")),
    hWnd,
  HMENU(GetIdentifiantUnivoque(i)),
    hInstance,
    NULL);
   if(GetFocalisation(i)!=NULL)
   {
    boutonPourFocus=hEdit[i];
   }
  }
  if(strncmp(GetTableauDescription(i),"L",1)==0)
  {
   hLib[i] = CreateWindowEx(
    0,
    TEXT("STATIC"),
    ConvertAnsiToUnicode(GetContenu(i)),
    WS_VISIBLE | WS_TABSTOP| WS_CHILD,
    atoi(GetAbscisse(i)),
    atoi(GetOrdonnee(i)),
    atoi(GetLargeur(i,"L")),
    atoi(GetHauteur(i,"L")),
    hWnd,
    HMENU(GetIdentifiantUnivoque(i)),
    hInstance,
    NULL);
  }
  if(strncmp(GetTableauDescription(i),"T",1)==0 &amp;&amp; !strstr(GetIdentifiantUnivoque(i),"#"))
  {   hTab[i] = CreateWindowEx(
    WS_EX_CLIENTEDGE,
    TEXT("LISTBOX"), 
    NULL,
    WS_VISIBLE|WS_CHILD|LBS_NOTIFY|WS_VSCROLL|WS_TABSTOP|WS_BORDER|LBS_USETABSTOPS,
    atoi(GetAbscisse(i)),
    atoi(GetOrdonnee(i)),//+15,
    atoi(GetLargeur(i,"T")),
    atoi(GetHauteur(i,"T")),//-15,
    hWnd,
    HMENU(i),
    hInstance,
    NULL);
   
// puis gestion du contenu des lignes, la aussi je l'ai enlevé, c'est deja assez ilisible

   }
  } 


 SetFocus(boutonPourFocus);


 ShowWindow(hWnd, nCmdShow);
 UpdateWindow(hWnd);
 while (GetMessage(&msg, NULL, 0, 0) > 0)
 {
  if (IsDialogMessage(hWnd, &msg) == 0)
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }

Voila, le focus sur les editbox fonctionne bien (pas pour les boutons , je ne sais pas pourquoi ). Et le TabStop n'avance pas non plus. Peut etre du fait que je fais une boucle, je ne sais pas?
J'affiche bien le slignes de mes listbox également, sauf que je ne sais pas comment mettre une ligne particuliere d'une certaine couleur? (je l'ai enlevé, mes la gestion des couleurs des différents controle fonctionne sinon). Je rappelle que je ne peux pas utiliser de ListView...
Voila, jespere que tu va reussir a comprendre!
Merci d'avance
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
1 juin 2007 à 23:17
En général ce n'est pas facile de trouver ce genre d'erreur sans regarder la totalité du code. La première remarque sur ton code c'est que tu utilises #include "stdafx.h" au lieu de #include <windows.h>. La deuxième est que tu crées tes controles child dans la fonction WinMain(). Normalement, les controles enfants sont créés pendant le traitement du message WM_CREATE dans la WndProc(). Ainsi tu éviteras l'utilisation de variables globales pour les HWND des controles car il est possible que ces variables soient écrasées ou modifiées dans d'autres parties du codes. Si tu ne trouve toujours pas la cause de ton problème, tu peux nous soumettre un lien de téléchargement de la totalité de ton projet. Sinon, tu peux faire un code minimal qui puisse illustrer ton problème et nous le soumettre.
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
4 juin 2007 à 09:17
Merci pour ta réponse. ;-)
En effet il manque #include <windows.h>, mais cela n'a ps l'air d'avoir d'incidence lorsque je le rajoute. D'ailleurs si j'enleve le #include "stdafx.h" , cela ne lui plait pas du tout... :
fatal error C1010: unexpected end of file while looking for precompiled header directive
En ce qui concerne le WM_CREATE, peux-tu me conseiller comment faire? Je recopie le code avant le "ShowWindow" dans le WM_CREATE? car evideement le compileur n'est pas d'accord, ne reconnaissant pas les différents attribbuts genre hInstance, ou meme MyRegisterClass...

Je suis un peu perdu dans tout ca, je ne pensais pas que ca pouvait poser des problemes de créer dans le WinMain()...
0

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

Posez votre question
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
4 juin 2007 à 09:18
Merci pour ta réponse. ;-)
En effet il manque #include <windows.h>, mais cela n'a ps l'air d'avoir d'incidence lorsque je le rajoute. D'ailleurs si j'enleve le #include "stdafx.h" , cela ne lui plait pas du tout... :
fatal error C1010: unexpected end of file while looking for precompiled header directive
En ce qui concerne le WM_CREATE, peux-tu me conseiller comment faire? Je recopie le code avant le "ShowWindow" dans le WM_CREATE? car evideement le compileur n'est pas d'accord, ne reconnaissant pas les différents attribbuts genre hInstance, ou meme MyRegisterClass...

Je suis un peu perdu dans tout ca, je ne pensais pas que ca pouvait poser des problemes de créer dans le WinMain()...
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
4 juin 2007 à 09:18
Merci pour ta réponse. ;-)
En effet il manque #include <windows.h>, mais cela n'a ps l'air d'avoir d'incidence lorsque je le rajoute. D'ailleurs si j'enleve le #include "stdafx.h" , cela ne lui plait pas du tout... :
fatal error C1010: unexpected end of file while looking for precompiled header directive
En ce qui concerne le WM_CREATE, peux-tu me conseiller comment faire? Je recopie le code avant le "ShowWindow" dans le WM_CREATE? car evideement le compileur n'est pas d'accord, ne reconnaissant pas les différents attribbuts genre hInstance, ou meme MyRegisterClass...

Je suis un peu perdu dans tout ca, je ne pensais pas que ca pouvait poser des problemes de créer dans le WinMain()...
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
4 juin 2007 à 09:18
Merci pour ta réponse. ;-)
En effet il manque #include <windows.h>, mais cela n'a ps l'air d'avoir d'incidence lorsque je le rajoute. D'ailleurs si j'enleve le #include "stdafx.h" , cela ne lui plait pas du tout... :
fatal error C1010: unexpected end of file while looking for precompiled header directive
En ce qui concerne le WM_CREATE, peux-tu me conseiller comment faire? Je recopie le code avant le "ShowWindow" dans le WM_CREATE? car evideement le compileur n'est pas d'accord, ne reconnaissant pas les différents attribbuts genre hInstance, ou meme MyRegisterClass...

Je suis un peu perdu dans tout ca, je ne pensais pas que ca pouvait poser des problemes de créer dans le WinMain()...
0
Rejoignez-nous