Empécher la modification d'une zone Edit [Résolu]

Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Dernière intervention
26 juillet 2007
- - Dernière réponse : adrienva
Messages postés
80
Date d'inscription
lundi 14 août 2006
Dernière intervention
27 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 ?

Merci d'avance pour votre aide.
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
3
Merci
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.

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
L'interception passe par le sous classement et C'EST très simple.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Dernière intervention
26 juillet 2007
0
Merci
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;
        }
Commenter la réponse de skirby
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Dernière intervention
26 juillet 2007
0
Merci
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_INITDIALOG:
      ...
      HDC hdc = GetDC(hEditNom);
      COLORREF crBkgnd = GetBkColor(hdc);
      g_hbrBkgnd = CreateSolidBrush(crBkgnd);
      ReleaseDC(hEditNom, hdc);
    break;

    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.

Merci d'avance.
Commenter la réponse de skirby
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
0
Merci
Salut,
Pour empêcher la modification d'un Edit , tu peux regarder mon dernier code source:
http://www.cppfrance.com/codes/EFFET-TYPEWRITER-WIN32_39064.aspx
Il te suffira de modifier la procédure de sous-classement selon ce que tu veux faire

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.
Commenter la réponse de racpp
Messages postés
80
Date d'inscription
lundi 14 août 2006
Dernière intervention
27 février 2007
0
Merci
Si tu bosse sous Vstudio, il me semble qu'il y a la propriété Readonly pour empecher la saisie. A moins que je n'aie pas compris le probleme ^^
Commenter la réponse de adrienva
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Dernière intervention
26 juillet 2007
0
Merci
Merci à tous pour vos réponses ! ! !

adrienva :
J'avais mentionné cette possibilité au début mais merci quand même.

BruNews :
Je ne connaissais pas GetSysColor, c'est parfait pour ce que je veux faire.
Merci aussi pour cette petite leçon sur les interceptions ;o)

racpp:
Super ta source. C'est original !
Il ne me reste plus qu'a trouver comment autoriser seulement le Ctrl+C mais je trouverais bien.

Merci et A+
Commenter la réponse de skirby
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
0
Merci
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;}

A:link { color:#0000ff; text-decoration:underline;}
A:visited { color:#0000ff; text-decoration:underline;}
A:hover { color:#3366ff; text-decoration:underline;}
MSHelp\:link {
color:#0000ff;
text-decoration:underline;
cursor:hand;
hoverColor:#3366ff;
filterString: ;}
]]></style><link href="ms-help://Hx/HxRuntime/HxLink.css" type="text/css" rel="stylesheet" />

<xml id="_topicdata" pagetype="winmsg" proj="WinUIHXS" name="WM_COPY" pubpath="/WinUI/WindowsUserInterface/DataExchange/Clipboard/ClipboardReference/ClipboardMessages/WM_COPY.htm"><!-- topic data --><root></root></xml>

<xml xmlns=""><mshelp:keyword index="A" term="_win32_WM_COPY"></mshelp:keyword><mshelp:keyword index="A" term="_win32_WM_COPY_cpp"></mshelp:keyword><mshelp:toctitle title="WM_COPY Message"></mshelp:toctitle><mshelp:rltitle title="WM_COPY Message ()"></mshelp:rltitle><mshelp:keyword index="F" term="WM_COPY"></mshelp:keyword><mshelp:keyword index="K" term="WM_COPY"></mshelp:keyword><mshelp:attr name="TopicType" value="kbRef"></mshelp:attr><mshelp:attr name="Locale" value="kbEnglish"></mshelp:attr><mshelp:attr name="DevLang" value="C++"></mshelp:attr><mshelp:attr name="Technology" value="WinUI"></mshelp:attr><mshelp:attr name="TechnologyVers" value="kbWinUI"></mshelp:attr><mshelp:attr name="DocSet" value="WCSDK"></mshelp:attr><mshelp:attr name="DocSet" value="LHSDK"></mshelp:attr><mshelp:attr name="DocSet" value="PSDK"></mshelp:attr><mshelp:attr name="TargetOS" value="Windows"></mshelp:attr><mshelp:attr name="TopicType" value="apiref"></mshelp:attr><mshelp:attr name="APIName" value="WM_COPY"></mshelp:attr><mshelp:attr name="APIType" value="NA"></mshelp:attr><mshelp:attr name="TopicType" value="kbSyntax"></mshelp:attr></xml>
Commenter la réponse de racpp
Messages postés
80
Date d'inscription
lundi 14 août 2006
Dernière intervention
27 février 2007
0
Merci
ah oui lol j'avais pas vu dsl ^^
Commenter la réponse de adrienva

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.