Partager via


Opérations de modification de texte de contrôle

Le système traite automatiquement toutes les opérations de texte initiées par l’utilisateur et avertit l’application lorsque les opérations sont terminées.

Les rubriques suivantes traitent des opérations de texte initiées par l’utilisateur et de la réponse de l’application :

Sélection d’un contrôle Modifier

L’utilisateur peut sélectionner un contrôle d’édition en cliquant dessus avec la souris ou en appuyant sur la touche TAB pour y accéder. La méthode tabulation fait partie d’une interface clavier prédéfinie que le système fournit. Pour obtenir une description complète de cette interface, consultez Boîtes de dialogue. Lorsque l’utilisateur sélectionne un contrôle d’édition, le système lui donne le focus clavier (voir « Focus et activation du clavier » dans À propos de l’entrée clavier) et met en surbrillance son texte à l’aide de la vidéo inversée.

Définition et récupération de texte

Une application peut définir le texte d’un contrôle d’édition à l’aide de la fonction SetWindowText , de la fonction SetDlgItemText ou en envoyant au contrôle un message WM_SETTEXT .

Pour récupérer tout le texte d’un contrôle d’édition, utilisez d’abord la fonction GetWindowTextLength ou le message WM_GETTEXTLENGTH afin de déterminer la taille de la mémoire tampon nécessaire pour contenir le texte. Ensuite, récupérez le texte à l’aide de la fonction GetWindowText , de la fonction GetDlgItemText ou du message WM_GETTEXT .

Sélection de texte

Après avoir sélectionné un contrôle d’édition, l’utilisateur peut sélectionner du texte dans le contrôle à l’aide de la souris ou du clavier. Une application peut récupérer les positions des caractères de début et de fin de la sélection actuelle dans un contrôle d’édition en envoyant au contrôle un message EM_GETSEL . La valeur de retour de la position de fin est supérieure au dernier caractère de la sélection (c’est-à-dire la position du premier caractère suivant le dernier caractère sélectionné).

Une application peut également sélectionner du texte dans un contrôle d’édition en envoyant au contrôle un message EM_SETSEL avec les index de caractères de début et de fin de la sélection. Par exemple, l’application peut utiliser EM_SETSEL avec EM_REPLACESEL pour supprimer du texte d’un contrôle de modification.

Ces trois messages s’appliquent aux contrôles d’édition monoligne et multiligne.

Remplacement de texte

Une application peut remplacer le texte sélectionné dans un contrôle d’édition en envoyant au contrôle un message EM_REPLACESEL avec un pointeur vers le texte de remplacement. S’il n’existe aucune sélection actuelle, EM_REPLACESEL insère le texte de remplacement au point d’insertion. L’application peut recevoir un code de notification EN_ERRSPACE si le texte de remplacement dépasse la mémoire disponible. Ce message s’applique aux contrôles d’édition monoligne et multiligne.

Une application peut utiliser EM_REPLACESEL pour remplacer une partie du texte d’un contrôle d’édition ou la fonction SetDlgItemText pour remplacer l’ensemble de celui-ci.

Modification de la police utilisée par un contrôle d’édition

Une application peut modifier la police utilisée par un contrôle de modification en envoyant le message WM_SETFONT . La plupart des applications le font lors du traitement du message WM_INITDIALOG . La modification de la police ne modifie pas la taille du contrôle d’édition ; les applications qui envoient le message WM_SETFONT peuvent être amenés à récupérer les métriques de police pour le texte et à recalculer la taille du contrôle d’édition. Pour plus d’informations sur les polices et les métriques de police, consultez Polices et texte.

Opérations couper le copier-coller et effacer

Quatre messages permettent de déplacer du texte entre un contrôle de modification et le Presse-papiers. Le message WM_COPY copie la sélection actuelle (le cas échéant) d’un contrôle d’édition dans le Presse-papiers sans la supprimer du contrôle d’édition. Le message WM_CUT supprime la sélection actuelle (le cas échéant) dans le contrôle d’édition et copie le texte supprimé dans le Presse-papiers. Le message WM_CLEAR supprime la sélection actuelle (le cas échéant) d’un contrôle d’édition, mais ne la copie pas dans le Presse-papiers (sauf si l’utilisateur a appuyé sur la touche Maj). Le message WM_PASTE copie le texte du Presse-papiers dans un contrôle de modification au point d’insertion. Ces quatre messages s’appliquent aux contrôles d’édition monoligne et multiligne.

Microsoft Windows NT 4.0 et versions ultérieures : un contrôle d’édition comprend un menu contextuel intégré qui permet à l’utilisateur de déplacer facilement du texte entre le contrôle d’édition et le Presse-papiers. Le menu contextuel s’affiche lorsque l’utilisateur clique avec le bouton droit sur le contrôle. Les commandes du menu contextuel incluent Annuler, Couper, Copier, Coller, Supprimer et Sélectionner tout.

Modification de texte

L’utilisateur peut sélectionner, supprimer ou déplacer du texte dans un contrôle de modification. Le système gère un indicateur interne pour chaque contrôle d’édition indiquant si le contenu du contrôle a été modifié. Le système efface cet indicateur lorsqu’il crée le contrôle et définit l’indicateur chaque fois que le texte du contrôle est modifié. Une application peut récupérer l’indicateur de modification en envoyant au contrôle un message EM_GETMODIFY . L’application peut ensuite définir ou effacer l’indicateur de modification en envoyant au contrôle un message EM_SETMODIFY . Ces messages s’appliquent aux contrôles d’édition monoligne et multiligne.

Limitation du texte entré par l’utilisateur

La limite par défaut de la quantité de texte qu’un utilisateur peut entrer dans un contrôle d’édition est de 32 Ko. Une application peut modifier la limite par défaut en envoyant au contrôle un message EM_SETLIMITTEXT . Ce message définit une limite stricte au nombre d’octets que l’utilisateur peut entrer dans un contrôle de modification, mais n’affecte ni le texte qui se trouve déjà dans le contrôle lors de l’envoi du message, ni le texte copié dans le contrôle par la fonction SetDlgItemText ou le message WM_SETTEXT . Par exemple, supposons que l’application utilise la fonction SetDlgItemText pour placer 500 octets dans un contrôle d’édition, et que l’utilisateur entre également 500 octets (1 000 octets au total). Si l’application envoie ensuite un message EM_SETLIMITTEXT limitant le texte entré par l’utilisateur à 300 octets, les 1 000 octets déjà présents dans le contrôle d’édition y restent et l’utilisateur ne peut pas ajouter de texte supplémentaire. En revanche, si l’application envoie un message EM_SETLIMITTEXT limitant le texte entré par l’utilisateur à 1 300 octets, les 1 000 octets restent, mais l’utilisateur peut ajouter 300 octets supplémentaires.

Lorsque l’utilisateur atteint la limite de caractères d’un contrôle d’édition, le système envoie à l’application un message WM_COMMAND contenant un code de notification EN_MAXTEXT . Ce code de notification ne signifie pas que la mémoire a été épuisée, mais que la limite de texte entré par l’utilisateur a été atteinte ; l’utilisateur ne peut plus entrer de texte. Pour modifier cette limite, une application doit envoyer au contrôle un nouveau message EM_SETLIMITTEXT avec une limite plus élevée.

À titre d’exemple d’utilisation de EM_SETLIMITTEXT et de EN_MAXTEXT, supposons que l’application ne doit pas limiter l’utilisateur à quatre caractères maximum dans un contrôle d’édition. L’application utilise EM_SETLIMITTEXT pour spécifier une limite de quatre caractères. Si l’utilisateur tente d’entrer un cinquième caractère, le système envoie un code de notification EN_MAXTEXT à l’application.

Opérations sur les caractères et les lignes

Plusieurs messages retournent des informations sur les caractères et les lignes dans un contrôle d’édition. La plupart des messages renvoient un index, généralement un nombre de base zéro, pour faire référence à un caractère ou à une ligne. Par exemple, dans un contrôle d’édition à ligne unique qui contient n caractères, l’index de ligne est égal à zéro et les caractères sont indexés de zéro à n-1. Dans un contrôle d’édition multiligne qui contient m lignes et n caractères, les lignes sont indexées de zéro à m-1, et les caractères sont indexés de zéro à n-1. Notez que l’indexation des caractères ignore les sauts de ligne.

Une application peut déterminer le nombre de caractères dans un contrôle d’édition en envoyant le message WM_GETTEXTLENGTH au contrôle d’édition. Ce message retourne la longueur, en caractères (sans compter le caractère null de fin), du texte dans un contrôle d’édition monoligne ou multiligne. Le message EM_LINELENGTH retourne la longueur, en caractères, d’une ligne spécifiée par l’index de caractères d’un caractère dans la ligne. La longueur retournée n’inclut aucun caractère sélectionné. Une application peut utiliser ces messages dans un contrôle d’édition monoligne ou multiligne.

Le message EM_GETFIRSTVISIBLELINE retourne l’index de base zéro de la ligne la plus supérieure visible dans un contrôle d’édition multiligne, ou l’index de base zéro du premier caractère visible dans un contrôle d’édition sur une seule ligne. Une application peut copier une ligne d’un contrôle d’édition vers une mémoire tampon en envoyant le message EM_GETLINE au contrôle d’édition. La ligne est spécifiée par son index de ligne et le premier mot de la mémoire tampon de réception contient le nombre maximal d’octets à copier dans la mémoire tampon. La valeur de retour est le nombre d’octets copiés. Ce message peut également être utilisé dans un contrôle d’édition monoligne ou multiligne.

Des messages uniques sont disponibles pour retourner les informations relatives à une ligne dans un contrôle d’édition multiligne. Le message EM_GETLINECOUNT retourne le nombre de lignes dans un contrôle d’édition. Le message EM_LINEFROMCHAR retourne l’index de la ligne contenant un index de caractères spécifié. Le message EM_LINEINDEX retourne l’index du premier caractère d’une ligne spécifiée.

Défilement du texte dans un contrôle d’édition

Pour implémenter le défilement dans un contrôle d’édition, vous pouvez utiliser les styles de défilement automatique décrits dans Modifier les types et styles de contrôle, ou vous pouvez ajouter explicitement des barres de défilement au contrôle d’édition. Pour ajouter une barre de défilement horizontale, utilisez le style WS_HSCROLL ; pour ajouter une barre de défilement verticale, utilisez le style WS_VSCROLL. Un contrôle d’édition avec des barres de défilement traite ses propres messages de barre de défilement. Pour plus d’informations sur l’ajout de barres de défilement pour modifier des contrôles, consultez Barres de défilement.

Le système fournit trois messages qu’une application peut envoyer à un contrôle d’édition avec des barres de défilement. Le message EM_LINESCROLL peut faire défiler un contrôle d’édition multiligne à la fois verticalement et horizontalement. Le paramètre lParam spécifie le nombre de lignes à faire défiler verticalement à partir de la ligne actuelle et le paramètre wParam spécifie le nombre de caractères à faire défiler horizontalement, à partir du caractère actif. Le contrôle d’édition ne reconnaît pas le défilement horizontal des messages s’il a le style ES_CENTER ou ES_RIGHT . Le message EM_LINESCROLL s’applique uniquement aux contrôles d’édition multiligne.

Le message EM_SCROLL fait défiler verticalement un contrôle d’édition multiligne. Le paramètre wParam spécifie l’action de défilement. Le message EM_SCROLL s’applique uniquement aux contrôles d’édition multilignes. EM_SCROLL a le même effet que le message WM_VSCROLL .

Le message EM_SCROLLCARET fait défiler le caret dans l’affichage d’un contrôle d’édition.

Définition des taquets de tabulation et des marges

Une application peut définir des taquets de tabulation dans un contrôle d’édition multiligne à l’aide du message EM_SETTABSTOPS . (La valeur par défaut d’un taquet de tabulation est de huit caractères.) Lorsqu’une application ajoute du texte au contrôle d’édition, les caractères de tabulation dans le texte génèrent automatiquement de l’espace jusqu’au taquet de tabulation suivant. Le message EM_SETTABSTOPS n’entraîne pas automatiquement le redessinage du texte par le système. Pour ce faire, une application peut appeler la fonction InvalidateRect . Le message EM_SETTABSTOPS s’applique uniquement aux contrôles d’édition multiligne.

Une application peut définir la largeur des marges gauche et droite d’un contrôle d’édition à l’aide du message EM_SETMARGINS . Après avoir envoyé ce message, le système redessine le contrôle d’édition pour refléter les nouveaux paramètres de marge. Une application peut récupérer la largeur de la marge gauche ou droite en envoyant le message EM_GETMARGINS . Par défaut, les marges de contrôle d’édition sont définies juste assez larges pour prendre en charge le plus grand caractère horizontal (largeurs ABC négatives) pour la police actuelle utilisée dans le contrôle d’édition.

Masquer l’entrée utilisateur

Une application peut utiliser un caractère de mot de passe dans un contrôle d’édition pour masquer l’entrée utilisateur. Lorsqu’un caractère de mot de passe est défini, il s’affiche à la place de chaque caractère que l’utilisateur tape. Lorsqu’un caractère de mot de passe est supprimé, le contrôle affiche les caractères que l’utilisateur tape. Si l’application crée un contrôle d’édition sur une ligne à l’aide du style ES_PASSWORD, le caractère de mot de passe par défaut est un astérisque (*). Une application peut utiliser le message EM_SETPASSWORDCHAR pour supprimer ou définir un autre caractère de mot de passe et le message EM_GETPASSWORDCHAR pour récupérer le caractère actuel du mot de passe. Ces messages s’appliquent uniquement aux contrôles d’édition monoligne.

Utilisation d’entiers

Il existe deux fonctions de conversion d’entiers pour les contrôles d’édition conçus pour contenir uniquement des nombres. La fonction SetDlgItemInt crée la représentation sous forme de chaîne d’un entier spécifié (signé ou non) et envoie la chaîne à un contrôle d’édition. SetDlgItemInt ne retourne aucune valeur. La fonction GetDlgItemInt crée un entier (signé ou non signé) à partir de sa représentation sous forme de chaîne dans un contrôle d’édition. GetDlgItemInt retourne l’entier (ou une valeur d’erreur).

Annulation d’opérations de texte

Chaque contrôle d’édition conserve un indicateur d’annulation qui indique si une application peut inverser ou annuler l’opération la plus récente sur le contrôle d’édition (annulation d’une suppression de texte, par exemple). Le contrôle d’édition définit l’indicateur d’annulation pour indiquer que l’opération peut être annulée et la réinitialise pour indiquer que l’opération ne peut pas être annulée. Une application peut déterminer le paramètre de l’indicateur d’annulation en envoyant au contrôle un message EM_CANUNDO .

Une application peut annuler l’opération la plus récente en envoyant au contrôle un message EM_UNDO . Une opération peut être annulée, à condition qu’aucune autre opération de contrôle de modification ne se produise en premier. Par exemple, l’utilisateur peut supprimer du texte, remplacer le texte (annuler la suppression), puis supprimer à nouveau le texte (annuler le remplacement). Le message EM_UNDO s’applique aux contrôles d’édition monoligne et multiligne et fonctionne toujours pour les contrôles d’édition monoligne.

Une application peut réinitialiser l’indicateur d’annulation d’un contrôle de modification en envoyant au contrôle un message EM_EMPTYUNDOBUFFER . Le système réinitialise automatiquement l’indicateur d’annulation chaque fois qu’un contrôle d’édition reçoit un message EM_SETHANDLE ou WM_SETTEXT . La fonction SetDlgItemText envoie un message WM_SETTEXT .

Gestion de Wordwrap et des sauts de ligne

Une application peut utiliser des fonctions Wordwrap avec des contrôles d’édition multilignes pour localiser le mot ou le fragment de mot qui doit être encapsulé à la ligne suivante. À l’aide de la fonction Wordwrap par défaut fournie par le système, les lignes se terminent toujours aux espaces entre les mots. Une application peut spécifier sa propre fonction Wordwrap en fournissant une fonction Wordwrap EditWordBreakProc et en envoyant au contrôle d’édition un message EM_SETWORDBREAKPROC . Une application peut récupérer l’adresse de la fonction Wordwrap actuelle en envoyant au contrôle un message EM_GETWORDBREAKPROC .

Une application peut diriger un contrôle d’édition multiligne pour ajouter ou supprimer automatiquement un caractère de saut de ligne souple (deux retours chariot et un flux de ligne) à la fin des lignes de texte encapsulées. Une application peut activer ou désactiver cette fonctionnalité en envoyant au contrôle d’édition un message EM_FMTLINES . Ce message s’applique uniquement aux contrôles d’édition multiligne et n’affecte pas une ligne qui se termine par un saut de ligne rigide (un retour chariot et un flux de ligne entrés par l’utilisateur). Également dans les contrôles d’édition multiligne, une application peut spécifier le style ES_WANTRETURN pour demander au système d’insérer un retour chariot lorsque l’utilisateur appuie sur la touche ENTRÉE dans le contrôle d’édition.

Récupération de points et de caractères

Pour déterminer le caractère le plus proche d’un point spécifié dans la zone cliente d’un contrôle d’édition, envoyez le message EM_CHARFROMPOS au contrôle. Le message retourne l’index de caractères et l’index de ligne du caractère le plus proche du point. De même, vous pouvez récupérer les coordonnées de zone client d’un caractère spécifié en envoyant le message EM_POSFROMCHAR . Le message retourne les coordonnées x et y du coin supérieur gauche du caractère spécifié.

Autocomplétion de chaînes

La saisie automatique étend les chaînes qui ont été partiellement entrées dans un contrôle d’édition en chaînes complètes. Par exemple, lorsqu’un utilisateur commence à entrer une URL dans le contrôle de modification d’adresse incorporée dans la barre d’outils Windows Internet Explorer, la saisie automatique développe la chaîne en une ou plusieurs URL complètes qui sont cohérentes avec la chaîne partielle existante. Une chaîne d’URL partielle telle que « micro » peut être développée vers «https://www.microsoft.com" ; ou « https://www.microsoft.com/windows". La saisie automatique est généralement utilisée avec des contrôles d’édition ou avec des contrôles qui ont un contrôle d’édition incorporé.

Pour plus d’informations, consultez la documentation de l’interface IAutoComplete et IAutoComplete2 .

Script complexe dans les contrôles d’édition

Un script complexe est une langue dont la forme imprimée n’est pas disposée de manière simple. Par exemple, un script complexe peut autoriser le rendu bidirectionnel, la mise en forme contextuelle des glyphes ou la combinaison de caractères. Les contrôles d’édition standard ont été étendus pour prendre en charge le texte multilingue et les scripts complexes. Cela inclut non seulement l’entrée et l’affichage, mais également le déplacement correct du curseur sur les clusters de caractères (dans le script Thaï et Devanagari, par exemple).

Une application bien écrite reçoit cette prise en charge automatiquement, sans modification. Là encore, vous devez envisager d’ajouter la prise en charge de l’ordre de lecture de droite à gauche et de l’alignement à droite. Dans ce cas, basculez les indicateurs de style étendu de la fenêtre de contrôle d’édition pour contrôler ces attributs, comme illustré dans l’exemple suivant.

// ID_EDITCONTROL is the control ID in the resource file.
HANDLE hWndEdit = GetDlgItem(hDlg, ID_EDITCONTROL);
LONG lAlign = GetWindowLong(hWndEdit, GWL_EXSTYLE) ;

// To toggle alignment
lAlign ^= WS_EX_RIGHT ;

// To toggle reading order
lAlign ^= WS_EX_RTLREADING ;

Après avoir défini la valeur lAlign , activez le nouvel affichage en définissant le style étendu de la fenêtre de contrôle d’édition comme suit.

// This assumes your edit control is in a dialog box. If not, 
// get the edit control handle from another source.

SetWindowLong(hWndEdit, GWL_EXSTYLE, lAlign);
InvalidateRect(hWndEdit, NULL, FALSE);

Uniscribe est un autre ensemble de fonctions qui fournissent un contrôle précis pour le traitement des scripts complexes. Pour plus d’informations, consultez Uniscribe.