Probleme WS_TABSTOP

Signaler
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Tu peux nous montrer ton code avant cette boucle des messages?
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

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()...
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

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()...
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

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()...
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

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()...