skirby
Messages postés96Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention26 juillet 2007
-
16 août 2006 à 11:28
adrienva
Messages postés77Date d'inscriptionlundi 14 août 2006StatutMembreDernière intervention27 février 2007
-
17 août 2006 à 09:22
Bonjour tout le monde,
J'aimerais savoir quelle est la méthode la plus simple et la plus propre pour empécher la saisie dans une zone de texte (contrôle Edit)
Je sais que l'on peut :
- Sous classer l'objet pour contrôler la saisie au clavier
- Mettre le contrôle en read only puis changer la couleur de fond (pour restaurer la couleur blanche)
Mais n'existe t'il pas une méthode plus simple comme l'interception d'un message Windows genre WM_KEYDOWN ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 16 août 2006 à 15:02
Va voir GetSysColor() pour avoir la couleur, faut aussi respecter le choix utilisateur défini dans le panneau de config, API te le donnera.
Dans proc de sous classement, "return 0" sur ce que tu veux interdire et repasse à la oldProc le reste.
skirby
Messages postés96Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention26 juillet 2007 16 août 2006 à 12:08
Salut BruNews,
Donc si je comprend bien, il n'existe pas d'autre méthode ?
N'est t'il pas possible d'annuler l'événement WM_KEYDOWN pour le contrôle en question genre :
case WM_COMMAND:
case IDC_EDT_MONCONTROLE:
switch (HIWORD(wParam)) {
case WM_KEYDOWN:
// blocage de l'événement pour l'annuler
return FALSE;
break;
}
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 16 août 2006 à 12:45
Faut bien saisir la diff entre pre-event et notif sur fenetre mère (post-event).
Ce que tu reçois sur la fenêtre parent est une notif d'action faite alors qu'aller récupérer le WM_KEYDOWN (ou autre) sur les events system par sous classement est une interception directe qui permet de l'annuler en ne repassant pas l'event au controle.
ciao...
BruNews, MVP VC++
Vous n’avez pas trouvé la réponse que vous recherchez ?
skirby
Messages postés96Date d'inscriptionvendredi 1 avril 2005StatutMembreDernière intervention26 juillet 2007 16 août 2006 à 14:21
Ok, j'ai bien compris la différence.
Pour la version avec le sous classement, comment faire pour n'autoriser que le copier (Ctrl + C) dans la zone Edit ?
Sinon, pour ma culture, j'essaye la version avec le contrôle en Read Only.
J'essaye de récupérer la couleur de fond d'une autre zone Edit afin de lui appliquer la même couleur (dans l'hypothèse où l'utilisateur utiliserait une autre couleur que le blanc pour les fenêtres).
Voici un extrait de mon code :
// Variables globales
HBRUSH g_hbrBkgnd;
case WM_CTLCOLORSTATIC:
switch (GetDlgCtrlID((HWND)(DWORD)LOWORD(lParam))) {
case IDC_EDT_INFO: // Contrôle dont je désire changer la couleur
return (LONG)g_hbrBkgnd;
break;
}
break;
Mon problème est que la fonction GetBkColor retourne toujours 0xFFFFFF (code erreur)
Est ce que j'utilise correctement la fonction ?
J'ai regardé sur le site de MSDN et il semblerait que oui.
Si quelqu'un pouvait faire un test et me dire ce qui ne va pas ce serait sympa.
GetBkColor() retourne la couleur d'arrière-plan et non la couleur de fond. La couleur d'arrière-plan concerne le texte alors que la couleur de fond concerne toute la zone interne de l'Edit.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 17 août 2006 à 00:31
Dans la procédure de sous-classement, tu peux ne laisser passer que le message WM_COPY. Mais il faut quand-même laisser passer d'autres messages comme pour le clic gauche, clic droit, etc.
Il serait donc préférable de bloquer les messages comme WM_CLEAR, WM_CUT, et WM_PASTE.<link href="../../../../../css/ie4.css" type="text/css" rel="stylesheet" /><!-- @ --><link href="../../../../../css/inetsdk.css" type="text/css" rel="stylesheet" /><!-- @ --><style type="text/css"><![CDATA[
PRE.clsCode { font-size:110%; }
PRE.clsSyntax { font-size:100%; }
TD DIV.clsBeta { display:none;}