Probleme sous-classement? [C-Win32] [Résolu]

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 a tous,
Voici mon probleme :
Je lis un fichier txt contenant les infos me permettant de créer mes composants sur ma page.
Ces composants peuvent etre des boutons, possédant un identifiant... Bref je gere ces identifiants, qui font par exemple que si l'utilisiteur appuie sur la touche clavier "Entrée", alors il va simuler le clik sur le bouton possedant comme identifiant "RETURN".
Vous me suivez? Bon voila, cela fonctionne tres bien pour ma premiere page.
J'ai donc voulu simuler maintenant plusieurs page a la suite. Lors d'un clik sur bouton, je "destroy" tous mes composants, je reinitialise mes tableaux et lit un nouveau fichiers txt, qui me permet d'afficher ma deuxieme page
Voici le hic : si dans cette deuxieme page j'ai egalement un bouton avec l'identifiant "RETURN", alors il simule également le clik, sans que je n'ai rappuyer pour autant sur la touche Entrée!!

Autrement dis, si je lis X fichiers contenant chacun un bouton contenant l'identifiant RETURN, alors si j'appuis une premiere fois sur Entrée, tous mes ecrans vont defiler a la suite sans rien faire...

Je ne comprends pas, j'ai essayé en reinitialisant toutes mes variables, ca ne marche toujours pas
J'en appelle donc a votre bonne volonté, merci

3 réponses

Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Résolu!
Désolé d'avoir fait perdre du temps avec un problème venant de mon code...
Lorsque je gérais la touche "Entrée" par exemple, je parcourais tout le tableau pour savoir si un composant possédais la touche "Entrée" comme parametre, et si je le trouvais alor je lancais l'action "cliquer sur le bouton"... mais je n'arretais pas la boucle, disant que le bouton était trouvé et donc que je pouvais m'arreter de boucler sans cesse...
Bon je ne suis pas clair?
Toujours est-il qu'avec un petit booleen , tout ceci rentre dans l'ordre
Merci a toi juju12 d'avoir pris le temps de t'intéresser a mon probleme, qui je l'avoue ne donne pas tres envie a quiconque de se plonger dedans
Merci, j'adore ce site!!!
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Tu devrais mettre un bout de code, notamment là où tu crées les contrôles et là où tu gère le click (enfin la touche clavier du coup), parce que là c'est difficile à voir.
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Pas de souci juju12, merci de répondre je commencais a desesperer!!
Voici ma création de controle :
case WM_CREATE:
{
            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_CHILD,
                        atoi(GetAbscisse(i)),
                        atoi(GetOrdonnee(i)),
                        atoi(GetLargeur(i,"B")),
                        atoi(GetHauteur(i,"B")),
                        hWnd,
                        HMENU(ID_BUTTON),
                        hinst,
                        NULL);
          //          OldButtonProc= NULL;
                    OldButtonProc = (WNDPROC) SetWindowLong(hBtn[i], GWL_WNDPROC, (LPARAM)ButtonProc);                                 if(GetFocalisation(i)!=NULL)
                    {
                        boutonPourFocus=hBtn[i];
                    }
                    if(GetCouleur(i)!=NULL)
                    {
                        AttribuerCouleur(i,GetCouleur(i));
                    }
                    else
                    {
                        couleurFond[i]=fondGris;
                        couleurFondTexte[i]=gris;
                        couleurTexte[i]=noir;
                    }                                   
                }
                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_CHILD|WS_TABSTOP,
                        atoi(GetAbscisse(i)),
                        atoi(GetOrdonnee(i)),

Pour t'expliquer un peu cette premiere partir, en fait je fais un parsing d'un fichier "codé" me disant quel composant créer, et j'en extrait les données. Donc si je tombe sur une ligne commencant par "B", je créé un Bouton avec les données requises. Ensuite je fais mon sous classement vers ButtonProc
Voila pourle sous classement par exemple du Bouton :
LRESULT CALLBACK ButtonProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_COMMAND:
        {
            if(LOWORD(wParam) == MYACCEL)
            {
                varGlobale = 1;
                TabulationArriere();
            }
            break;
        }
        case WM_KEYUP:
        {
            EcrireFichierBidon("keyup btnproc");
            if(wParam == VK_TAB)
            {
                if(!varGlobale)
                {
                    GererKeyUp(hwnd,message,wParam,lParam);
                }
                else varGlobale = 0;
            }
            else
            {
                GererKeyUp(hwnd,message,wParam,lParam);
                varGlobale=0;
            }
            break;
        }
        case WM_CHAR: // on gere le cas où une lettre est tapée : on doit vérifier si elle correspond à un bouton (premiere lettre soulignée par exemple)
        {
            EcrireFichierBidon("wmchar btnproc");
            VerifierSiRaccourci(hwnd, message, wParam, lParam);
            break;
        }
        default:
            break;
    }
    return CallWindowProc(OldButtonProc, hwnd, message, wParam, lParam);
}

Dans ce sous classement je gere :
    si une touche est relachee ( genre Entree, alors si le bouton a la focus on simule le clik
    si une touche Char est entree, on verifie si le bouton n'a pas cette lettre de soulignée, auquel cas on simule egalement le clik
    etc...
J'ai ainsi fait sur le meme principe un sous classement pour mes editbox, mes listbox et le WndProc général, si le focus est nulle part...
Et donc le souci, c'est que si j'appui sur un bouton pouvant etre utile également au deuxieme écran, il semble croire que j'appui également sur ce bouton une deuxieme fois..
J'espere que tu auras compris mes explications au combien claires ^^

Pour info, j'ai essayé d'initialiser toutes mes procedures de sous classement avant la création de l'ecran suivant, genre :
EditProc(NULL,NULL,NULL,NULL);
    WndProc(NULL,NULL,NULL,NULL);
    ListBoxProc(NULL,NULL,NULL,NULL);
    ButtonProc(NULL,NULL,NULL,NULL);
    GererKeyUp(NULL,NULL,NULL,NULL);
    VerifierSiRaccourci(NULL,NULL,NULL,NULL);

Et meme essayé de mettre le MSG capté a NULL( ca c'est ptet pas terribl je l'avoue) :
    msg.hwnd=NULL;
    msg.lParam=NULL;
    msg.message=NULL;
    msg.time=NULL;
    msg.wParam=NULL;

Voilou, je ne sais plus quoi faire!!