Empécher la modification d'une zone Edit

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

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 août 2006 à 11:45
L'interception passe par le sous classement et C'EST très simple.

ciao...
BruNews, MVP VC++
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 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;
        }
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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++
0

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

Posez votre question
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 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_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.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 août 2006 à 16:38
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.
0
adrienva Messages postés 77 Date d'inscription lundi 14 août 2006 Statut Membre Dernière intervention 27 février 2007 8
16 août 2006 à 19:37
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 ^^
0
skirby Messages postés 96 Date d'inscription vendredi 1 avril 2005 Statut Membre Dernière intervention 26 juillet 2007
16 août 2006 à 23:13
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+
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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;}

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>
0
adrienva Messages postés 77 Date d'inscription lundi 14 août 2006 Statut Membre Dernière intervention 27 février 2007 8
17 août 2006 à 09:22
ah oui lol j'avais pas vu dsl ^^
0
Rejoignez-nous