Empécher la modification d'une zone Edit

Résolu
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007
-
Messages postés
77
Date d'inscription
lundi 14 août 2006
Statut
Membre
Dernière intervention
27 février 2007
-
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.

10 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
L'interception passe par le sous classement et C'EST très simple.

ciao...
BruNews, MVP VC++
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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;
        }
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
77
Date d'inscription
lundi 14 août 2006
Statut
Membre
Dernière intervention
27 février 2007
8
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 ^^
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

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+
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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>
Messages postés
77
Date d'inscription
lundi 14 août 2006
Statut
Membre
Dernière intervention
27 février 2007
8
ah oui lol j'avais pas vu dsl ^^