IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Probleme avec Tabstop


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Par défaut Probleme avec Tabstop
    Je mets la propriete Tabstop a "true" pour les controles auxquelles je veux acceder dans ma dialog box. Je vais dans le menu Format et je choisi Tab order pour configurer l'ordre d'acces. Quand je teste avec "Test Dialog" tout marche correctement. Quand je lance mon application, j' ai acces au 1er controle... et c'est tout. Pas moyen de passer au suivant !
    Toute idee, piste.... est la bienvenue, ca fait deja plusieurs heures que je cherche:-/

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    c'est quoi le premier controle ?
    tu n'as pas intercepter des messages dans pretranslastemessage ,keydown etc ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Par défaut
    La dialog box herite de CAxDialogImpl (ATL)
    Le 1er controle est une ListBox.
    Je n'intercepte aucun message envoyer par le clavier moi-meme.

    J'ai teste en initialisant un timer quand ma fenetre est cree, qui envoie ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::SendMessage(m_hWnd, WM_NEXTDLGCTL, 0, FALSE);
    Et bien, ca marche! Il passe bien a l'element suivant mis dans le tab order a chaque fois.
    Donc a priori c'est la touche TAB qui est inactive, mais alors comment expliquer que les autres touches entree, espace, ... sont bien geree par mon appli ???

    Je suis perdu...
    Help plz!

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Par défaut
    Bon j'ai subclasse le traitement des messages fait par CAtlExeModuleT comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
       void RunMessageLoop() throw()
    	{
    		MSG msg;
    		while (GetMessage(&msg, 0, 0, 0) > 0)
    		{
    			TranslateMessage(&msg);
    			// TEST Send all keyboard messages to the window of the
    			// application.
    			/* Debut lignes rajoutees par rapport a la message loop par defaut */
    			if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
    			{
    					::SendMessage(m_mainWindowHWND, msg.message, msg.wParam, msg.lParam);
    			}
    			/* fin lignes rajoutees */
    			DispatchMessage(&msg);
    		}
    	}
    En mettant un breakpoint on voit que toutes les touches sont bien interceptees, mais la touche TAB ne fonctionne toujours pas.

    En modifiant comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    			/* Debut lignes rajoutees par rapport a la message loop par defaut */
    			if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
    			{
    				IsDialogMessage(m_mainWindowHWND, &msg);
    			}
    			/* fin lignes rajoutees */
    La touche TAB fonctionne!!! O_O
    Mais par exemple keydown ne fonctionne plus correctement (saute des items dans ma listbox par exemple!)

    En modifiant comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       void RunMessageLoop() throw()
    	{
    		MSG msg;
    		while (GetMessage(&msg, 0, 0, 0) > 0)
    		{
    		   if (!IsDialogMessage(m_mainWindowHWND, &msg) )
               {
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
               }
    		}
    	}
    La touche TAB fonctionne, keydown... aussi. MAIS la touche entree ne fonctionne plus dans la "list view" contenu dans ma dialog box!!!

    Comme dirait Christian Clavier "Mais qu'est c'que c'est qu'ce binz???"

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    bizarre tout ça ,le probleme doit venir de la classe ATL .
    tu as fais des recherches sur MSDN sur le sujet ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Par défaut
    Je viens de trouver ca a l'instant :
    "Applications that use modeless dialog boxes are required to filter messages through the IsDialogMessage function. IsDialogMessage modifies certain messages to implement dialog box behavior. For example, the ENTER key message is modified to generate a WM_COMMAND message with wParam set to IDOK."

    :-/

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Par défaut
    Du coup en faisant ca, ca marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
       void RunMessageLoop() throw()
    	{
    		MSG msg;
    		while (GetMessage(&msg, 0, 0, 0) > 0)
    		{
     
    			if (msg.hwnd == m_mainWindow.m_hListView
    				&& msg.message == WM_KEYDOWN
    				&& msg.wParam == VK_RETURN)
    			{
    			  TranslateMessage(&msg);
                  DispatchMessage(&msg);
    			}
    			else if (!IsDialogMessage(m_mainWindowHWND, &msg) )
               {
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
               }
    		}
    	}
    Mais bon surcharger (ie rajouter un test) la message loop ca me parait moyen, surtout pour les perfs, (ainsi que d'avoir acces au hwnd d'un controle en dehors de ma classe dialog...)

    Vous en pensez quoi ?

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    hum ,je ne suis pas trop familier d'atl .
    que fait la message loop de base ?
    pour l'acces au hwnd je ne pense que ca cause un probleme.
    pour les perfs tu constates une difference ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Par défaut
    Elle fait juste ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void RunMessageLoop() throw()
    	{
    		MSG msg;
    		while (GetMessage(&msg, 0, 0, 0) > 0)
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    Pour les perfs c'est plutot par principe, vu que cette methode est appelee un grand nombre de fois, j'aurais prefere faire autrement ; mais bon c'est pas critique...

    Merci pour tes reponses en tout cas

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    dans ce cas je ne pense pas que ça impacte trop sur les perfs.


Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo