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 :

[WIN32] pb WM_CHAR


Sujet :

MFC

  1. #1
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut [WIN32] pb WM_CHAR
    bonjour,

    j'ai repris une appli existante et j'ai un problême avec une fenêtre récalcitrante...

    Cette fenetre est une DialogBox (sans aucun controle dessus), lorsque j'appuie sur une touche je reçois WM_KEYDOWN / WM_KEYUP mais jamais WM_CHAR ???

    Quelqu'un à une explication ?

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    essaie d'intercepter le message avec IsDialogMessage

  3. #3
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par nico-pyright(c)
    essaie d'intercepter le message avec IsDialogMessage
    IsDialogMessage(), c'est dans la boucle qui pompe les messages, non ?
    si c'est le cas, je n'ai pas accès à cette boucle, ma DialogBox est créée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     	if( (iRc = DialogBox(hInst_g, MAKEINTRESOURCE(DB_GENERE), NULL, ProcDlgGenere )) == 1 )

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Il faudrait dans ce cas utiliser CreateDialog

    Attention à renvoyer FALSE au moment du WM_INITDIALOG

  5. #5
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par nico-pyright(c)
    Il faudrait dans ce cas utiliser CreateDialog

    Attention à renvoyer FALSE au moment du WM_INITDIALOG
    Ok je vais essayer...

  6. #6
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    je croyais qu'il était conseillé que WM_INITDIALOG retourne TRUE ?

  7. #7
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    ok, j'ai remplacé mon code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	MSG tMsg;
    	hWndGenere_g = CreateDialog( hInst_g, MAKEINTRESOURCE(DB_GENERE), NULL, ProcDlgGenere );
    	while( GetMessage( &tMsg, hWndGenere_g, 0,0 ) > 0 )
    	{ 
    		if( FALSE == IsDialogMessage( hWndGenere_g, &tMsg ) )
    		{ 
    			TranslateMessage( &tMsg ); 
    			DispatchMessage( &tMsg ); 
    		} 
    	}
    mais toujours le même comportement ?!

    je précise que cette boite de dialogue est dans une DLL...

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Bon, après essai, si tu utilises CreateDialog, tu n'as pas besoin de IsDialogMessage

    ex :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    INT_PTR WINAPI ProcDlgGenere(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg) 
    	{
    		case WM_INITDIALOG:
    			return TRUE;
    		case WM_CHAR:
    			MessageBox(NULL,"ici","",0);
    			break;
    		case WM_CLOSE:
    			PostQuitMessage(1);
    			return TRUE;
    			break;
    	}
    	return(FALSE);
    }
     
    int APIENTRY WinMain(HINSTANCE hInst_g, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
       MSG tMsg;
       HWND hWndGenere_g = CreateDialog( hInst_g, MAKEINTRESOURCE(IDD_DIALOG1), NULL, ProcDlgGenere );
       ShowWindow(hWndGenere_g, SW_SHOWNORMAL);
       UpdateWindow(hWndGenere_g);
       while( GetMessage( &tMsg, hWndGenere_g, 0,0 ) > 0 )
       {
             TranslateMessage( &tMsg );
             DispatchMessage( &tMsg );
       }
       return tMsg.message;
    }

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh... Après essais chez moi, je dirais plutôt que si, on a besoin de IsDialogMessage() si on utilise CreateDialog() au lieu de DialogBox().
    Toutefois, c'est assez facultatif quand même, car cela sert surtout à la navigation au clavier (tab, flèches etc. et (hélas) Echap).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    merci de vos réponses, ça marche effectivement (TAB fonctionne) mais je ne reçois jamais WM_CHAR quelque soit la touche appuyée, ce que je trouve intrigant !

  11. #11
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    et le plus embêtant, c'est que la boite de dialogue devient modeless !!! ce qui m'oblige à quelques substanciels changements ...

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    t'as essayé mon exemple ?
    j'ai testé et je captais bien le WM_CHAR

  13. #13
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    désolé pour le retard...

    j'ai adapté ton exemple à une utilisation dans une dll, mais toujours pas de WM_CHAR

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le IsDialogMessage(), tu l'as mis ou non?
    Parce que lui intercepte le WM_KEYDOWN, donc le TranslateMessage() n'est jamais exécuté, donc aucun WM_CHAR n'est reçu...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Citation Envoyé par Médinoc
    Le IsDialogMessage(), tu l'as mis ou non?
    Parce que lui intercepte le WM_KEYDOWN, donc le TranslateMessage() n'est jamais exécuté, donc aucun WM_CHAR n'est reçu...
    es-tu sur ? la doc MSDN ne semble pas dire ça...
    mais j'ai resolu le pb: j'ai mis la dialogbox toute seule dans un thread, et là, tout marche (y compris TAB). donc voilou... merci à tout ceux qui ce sont penché sur mon pb.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. [Kylix] kylix3 ----> win32
    Par blue dans le forum EDI
    Réponses: 3
    Dernier message: 28/01/2003, 11h27
  3. gcc et win32
    Par MatRem dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 16/01/2003, 12h22
  4. [API win32] Récupérer le répertoire d'un profile
    Par sbeu dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h38
  5. convertir un nom long (win32) en format dos (8+3)
    Par kylekiller dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2002, 13h34

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