!!! Bloquer touche entrée !!!

Résolu
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 - 5 nov. 2004 à 20:26
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 - 6 nov. 2004 à 13:17
Salut,

j'arrive pas à empêcher un retour à la ligne dans une richedit multiligne quand l'utilisateur appuie sur entrée.
Je m'explique.
Ca me servirait pour un chat, et je voudrais que là où l'utilisateur tape son texte, le retour à la ligne ne se fasse que si il appuie en même temps sur Ctrl+Entrée.
Parce que la touche Entrée me sert à envoyer le message et donc pour l'instant ça merde.
Je me sert des hook mais impossible de bloquer le retour chariot.
J'ai cherché des sources mais j'en ai pas trouvé.
Donc si vous en avez ou des exemples, allez-y, envoyez !!!

Merci d'avance.

YOYO, @+.

:big) YOYO ;)

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
6 nov. 2004 à 03:10
Salut,
Je pense que la meilleure solution t'a été proposée par BruNews. Tu dois sous-classer ton richedit. Le principe du sous-classement est simple. Tu crée une procédure d'interception des messages destinés au richedit. Cette procédure ne traitera que le message WM_KEYDOWN (et WM_CHAR) en retournant 0 quand il s'agit de VK_RETURN. Si tu veux utiliser la touche ENTREE pour envoyer les mots tapés, tu appelle la fonction d'envoie juste avant de retourner 0. Ainsi, le richedit ne recevra jamais le signal de l'appui sur cette touche. Tous les autres messages seront transmis à la procédure originale du richedit pour ne pas perturber son comportement. Cette procédure est invisible, c'esr elle qui gère le fonctionement du richedit.
Voici le prototype d'une procédure de sous-classement:
LRESULT CALLBACK MaProcedure (HWND,UINT,WPARAM,LPARAM);

Pour obtenir l'adresse de la procédure du richedit et la remplacer par l'adresse de la notre on utilise la fonction SetWindowLong():
WNDPROC richeditProc=(WNDPROC) SetWindowLong(hrichedit, GWL_WNDPROC, (LPARAM)MaProcedure);

hrichedit est le handle HWND du richedit.
Voici l'exemple de la procédure de sous-classement:
LRESULT CALLBACK MaProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     switch (message) 
     {
     case WM_GETDLGCODE:
               return (DLGC_WANTALLKEYS | CallWindowProc  (richeditProc, hwnd, message, wParam, lParam));

    case WM_CHAR:
      if ((wParam == VK_RETURN) return 0;
      break;

      case WM_KEYDOWN:
      if ((wParam == VK_RETURN))
      {
       // ici appel de la fonction d'envoi des mots tapés
      return 0;
      }
      break;
      }
return CallWindowProc(richeditProc, hwnd, message, wParam, lParam);
}


Voila, j'espère que c'est assez clair.
3
cs_Adeon Messages postés 293 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 10 avril 2015 2
5 nov. 2004 à 20:59
ba si je comprend ton probleme, pour le resoudre il suffi de programmer un truc dans ce genre :

bool control_actif
si apui sur control alors
control_actif = true
si relachement control alors
control_actif = false
si apui sur entre et control_actif = true alors ....

:big) Adeon 8-)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 nov. 2004 à 21:29
Sous classe ton richedit et traite WM_KEYDOWN dans la proc de sous classement.

ciao...
BruNews, MVP VC++
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
5 nov. 2004 à 21:35
Au pire tu mets entrée pour le retour a la ligne et E pour envoyer par exemple...
Sinon pour ton prob...je pense qu'il ya un buffer ou le code de la touche enfoncé est stocké et celui ci ne doit pas etre encore effacé au moment ou tu detecte le retour chariot apres avoir envoyé....
C'etait juste une piste...mais tu dois surement y avoir deja pensé...
0

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

Posez votre question
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
6 nov. 2004 à 09:45
Alors là racpp, j'ai qu'un mot à dire GENIAL !!!
Non seulement c'est ce que je cherchais mais en plus c'est super bien expliqué, moi qui craignais le sous-classement, en fait vu comme ça, ça l'est pas du tout.
Par contre je suis obligé de mettre le SetWindowLong(...) dans le WM_SIZE, parce qu'il ne fonctionne pas si je le mets dans WM_CREATE.
En tout cas, un énorme MERCI à toi racpp !

YOYO, @+.

:big) YOYO ;)
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
6 nov. 2004 à 12:58
Salut,
Très content de t'avoir un peu aidé. Ca fait toujours plaisir.
A propos de SetWindowLong(), il est préférable de la mettre juste après la création du RichEdit avec CreateWindowEx() pendant le traitement du message WM_CREATE. La variable "richeditProc" doit être déclarée de manière globale pour qu'elle soit accessible dans toutes les fonctions du programme, et surtout dans la procédure de sous classement. C'est un détail que j'avais omis pour ne pas brouiller l'explication. Voici un exemple:
#include <windows.h>
// ici les autres include 
WNDPROC richeditProc; // déclaration globale

Dans la procédure de ta fenêtre principale tu fais:
case WM_CREATE:
//......
hrichedit=CreateWindowEx(.........);
richeditProc=SetWindowLong(.......);
//......


Bonne programmation!
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
6 nov. 2004 à 13:17
Je te remercie à nouveau racpp(décidément ça continue ;-D).
J'avais réussi à le faire moi-même. C'est que je créais tous les composants (boutons, edits, ...) hors de WM_CREATE et donc ça créait ma fenêtre mais le sous-classement se faisait avant la création de la richedit et tout le toin-toin.

Merci encore racpp.

YOYO, @+.

:big) YOYO ;)
0
Rejoignez-nous