Compartir a través de


Editar operaciones de texto de control

El sistema procesa automáticamente todas las operaciones de texto iniciadas por el usuario y notifica a la aplicación cuando se completan las operaciones.

En los temas siguientes se describen las operaciones de texto iniciadas por el usuario y la respuesta de la aplicación:

Selección de un control de edición

El usuario puede seleccionar un control de edición haciendo clic en él con el mouse o presionando la tecla TAB para desplazarse a él. El método de tabulación forma parte de una interfaz de teclado predefinida que proporciona el sistema. Para obtener una descripción completa de esta interfaz, vea Cuadros de diálogo. Cuando el usuario selecciona un control de edición, el sistema proporciona el control del foco del teclado (consulta "Foco de teclado y activación" en Acerca de la entrada del teclado) y resalta su texto mediante el uso de vídeo inverso.

Establecer y recuperar texto

Una aplicación puede establecer el texto de un control de edición mediante la función SetWindowText , la función SetDlgItemText o enviando al control un mensaje de WM_SETTEXT .

Para recuperar todo el texto de un control de edición, use primero la función GetWindowTextLength o el mensaje WM_GETTEXTLENGTH para determinar el tamaño del búfer necesario para contener el texto. A continuación, recupere el texto mediante la función GetWindowText , la función GetDlgItemText o el mensaje WM_GETTEXT .

Selección de texto

Después de seleccionar un control de edición, el usuario puede seleccionar texto en el control mediante el mouse o el teclado. Una aplicación puede recuperar las posiciones de carácter inicial y final de la selección actual en un control de edición enviando al control un mensaje de EM_GETSEL . El valor devuelto para la posición final es uno mayor que el último carácter de la selección (es decir, la posición del primer carácter después del último carácter seleccionado).

Una aplicación también puede seleccionar texto en un control de edición enviando al control un mensaje de EM_SETSEL con los índices de caracteres inicial y final de la selección. Por ejemplo, la aplicación puede usar EM_SETSEL con EM_REPLACESEL para eliminar texto de un control de edición.

Estos tres mensajes se aplican a los controles de edición de una sola línea y de varias líneas.

Reemplazar texto

Una aplicación puede reemplazar el texto seleccionado en un control de edición enviando al control un mensaje de EM_REPLACESEL con un puntero al texto de reemplazo. Si no hay ninguna selección actual, EM_REPLACESEL inserta el texto de reemplazo en el punto de inserción. La aplicación puede recibir un código de notificación EN_ERRSPACE si el texto de reemplazo supera la memoria disponible. Este mensaje se aplica a los controles de edición de una sola línea y de varias líneas.

Una aplicación puede usar EM_REPLACESEL para reemplazar parte del texto de un control de edición o la función SetDlgItemText para reemplazarlo todo.

Cambiar la fuente usada por un control de edición

Una aplicación puede cambiar la fuente que usa un control de edición enviando el mensaje WM_SETFONT . La mayoría de las aplicaciones lo hacen al procesar el mensaje WM_INITDIALOG . Cambiar la fuente no cambia el tamaño del control de edición; Es posible que las aplicaciones que envían el mensaje de WM_SETFONT tengan que recuperar las métricas de fuente del texto y recalcular el tamaño del control de edición. Para obtener más información sobre las fuentes y las métricas de fuente, vea Fuentes y texto.

Cortar operaciones de pegado y borrar copia

Hay cuatro mensajes para mover texto entre un control de edición y el Portapapeles. El WM_COPY mensaje copia la selección actual (si existe) de un control de edición en el Portapapeles sin eliminarla del control de edición. El mensaje WM_CUT elimina la selección actual (si existe) en el control de edición y copia el texto eliminado en el Portapapeles. El mensaje WM_CLEAR elimina la selección actual (si existe) de un control de edición, pero no la copia en el Portapapeles (a menos que el usuario presione la tecla MAYÚS). El WM_PASTE mensaje copia el texto del Portapapeles en un control de edición en el punto de inserción. Estos cuatro mensajes se aplican a los controles de edición de una sola línea y de varias líneas.

Microsoft Windows NT 4.0 y versiones posteriores: un control de edición incluye un menú contextual integrado que facilita al usuario mover texto entre el control de edición y el Portapapeles. El menú contextual aparece cuando el usuario hace clic con el botón derecho en el control. Los comandos del menú contextual incluyen Deshacer, Cortar, Copiar, Pegar, Eliminar y Seleccionar todo.

Modificar texto

El usuario puede seleccionar, eliminar o mover texto en un control de edición. El sistema mantiene una marca interna para cada control de edición que indica si se ha modificado el contenido del control. El sistema borra esta marca cuando crea el control y establece la marca cada vez que se modifica el texto del control. Una aplicación puede recuperar la marca de modificación enviando al control un mensaje de EM_GETMODIFY . Después, la aplicación puede establecer o borrar la marca de modificación enviando al control un mensaje de EM_SETMODIFY . Estos mensajes se aplican a los controles de edición de una sola línea y de varias líneas.

Limitar texto escrito por el usuario

El límite predeterminado para la cantidad de texto que un usuario puede escribir en un control de edición es de 32 KB. Una aplicación puede cambiar el límite predeterminado enviando al control un mensaje de EM_SETLIMITTEXT . Este mensaje establece un límite máximo en el número de bytes que el usuario puede introducir en un control de edición, pero no afecta al texto que ya está en el control cuando el mensaje se envió ni el texto copiado en el control por la función SetDlgItemText o el mensaje WM_SETTEXT . Por ejemplo, supongamos que la aplicación usa la función SetDlgItemText para colocar 500 bytes en un control de edición, y el usuario también escribe 500 bytes (1000 bytes en total). Si la aplicación envía un mensaje de EM_SETLIMITTEXT que limita el texto escrito por el usuario a 300 bytes, los 1000 bytes que ya están en el control de edición permanecen allí y el usuario no puede agregar más texto. Por otro lado, si la aplicación envía un mensaje de EM_SETLIMITTEXT que limita el texto escrito por el usuario a 1300 bytes, los 1000 bytes permanecen, pero el usuario puede agregar 300 bytes más.

Cuando el usuario alcanza el límite de caracteres de un control de edición, el sistema envía a la aplicación un mensaje WM_COMMAND que contiene un código de notificación EN_MAXTEXT . Este código de notificación no significa que se haya agotado la memoria, pero que se ha alcanzado el límite de texto escrito por el usuario; el usuario no puede escribir más texto. Para cambiar este límite, una aplicación debe enviar al control un nuevo mensaje de EM_SETLIMITTEXT con un límite mayor.

Como ejemplo del uso de EM_SETLIMITTEXT y EN_MAXTEXT, supongamos que la aplicación debe limitar al usuario a no más de cuatro caracteres en un control de edición. La aplicación usaría EM_SETLIMITTEXT para especificar un límite de cuatro caracteres. Si el usuario intentó escribir un quinto carácter, el sistema enviaría un código de notificación EN_MAXTEXT a la aplicación.

Operaciones de caracteres y líneas

Hay varios mensajes que devuelven información sobre los caracteres y las líneas de un control de edición. La mayoría de los mensajes devuelven un índice, normalmente un número de base cero, para hacer referencia a un carácter o una línea. Por ejemplo, en un control de edición de una sola línea que contiene n caracteres, el índice de línea es cero y los caracteres se indexan de cero a n-1. En un control de edición multilínea que contiene líneas m y n caracteres, las líneas se indexan de cero a m-1 y los caracteres se indexan de cero a n-1. Tenga en cuenta que la indexación de caracteres omite los saltos de línea.

Una aplicación puede determinar el número de caracteres de un control de edición enviando el mensaje WM_GETTEXTLENGTH al control de edición. Este mensaje devuelve la longitud, en caracteres (sin incluir el carácter NULO de terminación), del texto de un control de edición de una sola línea o de varias líneas. El EM_LINELENGTH mensaje devuelve la longitud, en caracteres, de una línea especificada por el índice de caracteres de un carácter en la línea. La longitud devuelta no incluye ningún carácter seleccionado. Una aplicación puede usar estos mensajes en un control de edición de una sola línea o de varias líneas.

El mensaje EM_GETFIRSTVISIBLELINE devuelve el índice de base cero de la línea visible superior en un control de edición de varias líneas o el índice de base cero del primer carácter visible en un control de edición de una sola línea. Una aplicación puede copiar una línea de un control de edición a un búfer enviando el mensaje EM_GETLINE al control de edición. Su índice de línea especifica la línea y la primera palabra del búfer receptor contiene el número máximo de bytes que se van a copiar en el búfer. El valor devuelto es el número de bytes copiados. Este mensaje también se puede usar en un control de edición de una sola línea o de varias líneas.

Hay mensajes únicos disponibles para devolver la información sobre una línea en un control de edición de varias líneas. El EM_GETLINECOUNT mensaje devuelve el número de líneas de un control de edición. El EM_LINEFROMCHAR mensaje devuelve el índice de la línea que contiene un índice de caracteres especificado. El EM_LINEINDEX mensaje devuelve el índice del primer carácter de una línea especificada.

Desplazamiento de texto en un control De edición

Para implementar el desplazamiento en un control de edición, puede usar los estilos de desplazamiento automáticos descritos en Editar tipos de control y estilos, o puede agregar explícitamente barras de desplazamiento al control de edición. Para agregar una barra de desplazamiento horizontal, use el estilo WS_HSCROLL; para agregar una barra de desplazamiento vertical, use el estilo WS_VSCROLL. Un control de edición con barras de desplazamiento procesa sus propios mensajes de barra de desplazamiento. Para obtener información detallada sobre cómo agregar barras de desplazamiento para editar controles, vea Barras de desplazamiento.

El sistema proporciona tres mensajes que una aplicación puede enviar a un control de edición con barras de desplazamiento. El mensaje EM_LINESCROLL puede desplazar un control de edición de varias líneas tanto vertical como horizontalmente. El parámetro lParam especifica el número de líneas que se desplazarán verticalmente a partir de la línea actual y el parámetro wParam especifica el número de caracteres que se desplazarán horizontalmente, empezando por el carácter actual. El control de edición no reconoce los mensajes de desplazamiento horizontal si tiene el estilo ES_CENTER o ES_RIGHT . El mensaje de EM_LINESCROLL solo se aplica a los controles de edición de varias líneas.

El mensaje EM_SCROLL desplaza verticalmente un control de edición multilínea. El parámetro wParam especifica la acción de desplazamiento. El mensaje EM_SCROLL solo se aplica a los controles de edición de varias líneas. EM_SCROLL tiene el mismo efecto que el mensaje WM_VSCROLL .

El EM_SCROLLCARET mensaje desplaza el símbolo de intercalación en vista en un control de edición.

Establecer tabulaciones y márgenes

Una aplicación puede establecer tabulaciones en un control de edición multilínea mediante el mensaje EM_SETTABSTOPS . (El valor predeterminado de una tabulación es de ocho caracteres). Cuando una aplicación agrega texto al control de edición, los caracteres de tabulación del texto generan automáticamente espacio hasta la siguiente tabulación. El EM_SETTABSTOPS mensaje no hace que el sistema vuelva a dibujar el texto automáticamente. Para ello, una aplicación puede llamar a la función InvalidateRect . El mensaje EM_SETTABSTOPS solo se aplica a los controles de edición de varias líneas.

Una aplicación puede establecer el ancho de los márgenes izquierdo y derecho de un control de edición mediante el EM_SETMARGINS mensaje. Después de enviar este mensaje, el sistema vuelve a dibujar el control de edición para reflejar la nueva configuración de margen. Una aplicación puede recuperar el ancho del margen izquierdo o derecho enviando el mensaje EM_GETMARGINS . De forma predeterminada, los márgenes de control de edición se establecen lo suficientemente ancho como para dar cabida al voladizo horizontal de caracteres más grande (anchos ABC negativos) para la fuente actual que se usa en el control de edición.

Ocultar la entrada del usuario

Una aplicación puede usar un carácter de contraseña en un control de edición para ocultar la entrada del usuario. Cuando se establece un carácter de contraseña, se muestra en lugar de cada carácter que escribe el usuario. Cuando se quita un carácter de contraseña, el control muestra los caracteres que escribe el usuario. Si la aplicación crea un control de edición de una sola línea mediante el estilo ES_PASSWORD, el carácter de contraseña predeterminado es un asterisco (*). Una aplicación puede usar el mensaje de EM_SETPASSWORDCHAR para quitar o definir un carácter de contraseña diferente y el mensaje EM_GETPASSWORDCHAR para recuperar el carácter de contraseña actual. Estos mensajes solo se aplican a los controles de edición de una sola línea.

Uso de enteros

Hay dos funciones de conversión de enteros para los controles de edición diseñados para contener solo números. La función SetDlgItemInt crea la representación de cadena de un entero especificado (con signo o sin signo) y envía la cadena a un control de edición. SetDlgItemInt no devuelve ningún valor. La función GetDlgItemInt crea un entero (firmado o sin signo) a partir de su representación de cadena en un control de edición. GetDlgItemInt devuelve el entero (o un valor de error).

Deshacer operaciones de texto

Cada control de edición mantiene una marca de deshacer que indica si una aplicación puede invertir o deshacer la operación más reciente en el control de edición (deshacer una eliminación de texto, por ejemplo). El control de edición establece la marca de deshacer para indicar que la operación se puede deshacer y restablecerla para indicar que la operación no se puede deshacer. Una aplicación puede determinar la configuración de la marca de deshacer enviando al control un mensaje de EM_CANUNDO .

Una aplicación puede deshacer la operación más reciente enviando al control un mensaje de EM_UNDO . Una operación se puede deshacer siempre que no se produzca ninguna otra operación de control de edición en primer lugar. Por ejemplo, el usuario puede eliminar texto, reemplazar el texto (deshacer la eliminación) y, a continuación, eliminar el texto de nuevo (deshacer el reemplazo). El mensaje de EM_UNDO se aplica a los controles de edición de una sola línea y de varias líneas y siempre funciona para los controles de edición de una sola línea.

Una aplicación puede restablecer la marca de deshacer de un control de edición enviando al control un mensaje de EM_EMPTYUNDOBUFFER . El sistema restablece automáticamente la marca de deshacer cada vez que un control de edición recibe un mensaje de EM_SETHANDLE o WM_SETTEXT . La función SetDlgItemText envía un mensaje WM_SETTEXT .

Control de saltos de línea y wordwrap

Una aplicación puede usar funciones de Wordwrap con controles de edición de varias líneas para buscar la palabra o fragmento de palabra que se debe ajustar a la línea siguiente. Con la función predeterminada Wordwrap proporcionada por el sistema, las líneas siempre terminan en los espacios entre palabras. Una aplicación puede especificar su propia función Wordwrap proporcionando una función EditWordBreakProc Wordwrap y enviando al control de edición un mensaje de EM_SETWORDBREAKPROC . Una aplicación puede recuperar la dirección de la función Wordwrap actual enviando al control un mensaje de EM_GETWORDBREAKPROC .

Una aplicación puede dirigir un control de edición de varias líneas para agregar o quitar un carácter de salto de línea suave (dos retornos de carro y una fuente de línea) automáticamente al final de las líneas de texto ajustado. Una aplicación puede activar o desactivar esta característica enviando al control de edición un mensaje de EM_FMTLINES . Este mensaje solo se aplica a los controles de edición de varias líneas y no afecta a una línea que termina con un salto de línea duro (un retorno de carro y una fuente de línea introducida por el usuario). Además, en los controles de edición de varias líneas, una aplicación puede especificar el estilo de ES_WANTRETURN para solicitar que el sistema inserte un retorno de carro cuando el usuario presione la tecla ENTRAR en el control de edición.

Recuperar puntos y caracteres

Para determinar el carácter más cercano a un punto especificado en el área cliente de un control de edición, envíe el mensaje EM_CHARFROMPOS al control. El mensaje devuelve el índice de caracteres y el índice de línea del carácter más cercano al punto. Del mismo modo, puede recuperar las coordenadas del área de cliente de un carácter especificado enviando el mensaje EM_POSFROMCHAR . El mensaje devuelve las coordenadas x e y de la esquina superior izquierda del carácter especificado.

Autocompletar de cadenas

Autocompletar expande las cadenas que se han escrito parcialmente en un control de edición en cadenas completas. Por ejemplo, cuando un usuario empieza a escribir una dirección URL en el control De edición de direcciones incrustado en la barra de herramientas de Windows Internet Explorer, la función autocompletar expande la cadena en una o varias direcciones URL completas que sean coherentes con la cadena parcial existente. Una cadena de dirección URL parcial como "mic" podría expandirse a "https://www.microsoft.com" o "https://www.microsoft.com/windows". La autocompletar se usa normalmente con controles de edición o con controles que tienen un control de edición incrustado.

Para obtener más información, consulte la documentación de la interfaz IAutoComplete e IAutoComplete2 .

Script complejo en controles de edición

Un script complejo es un lenguaje cuyo formulario impreso no se diseña de una manera sencilla. Por ejemplo, un script complejo puede permitir la representación bidireccional, la forma contextual de glifos o la combinación de caracteres. Los controles de edición estándar se han ampliado para admitir texto multilingüe y scripts complejos. Esto incluye no solo la entrada y la presentación, sino también el movimiento de cursor correcto sobre clústeres de caracteres (por ejemplo, en tailandés y devanagari).

Una aplicación bien escrita recibe esta compatibilidad automáticamente, sin modificaciones. De nuevo, debe considerar la posibilidad de agregar compatibilidad con el orden de lectura de derecha a izquierda y la alineación derecha. En este caso, cambie las marcas de estilo extendidas de la ventana de control de edición para controlar estos atributos, como se muestra en el ejemplo siguiente.

// 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 ;

Después de establecer el valor lAlign , habilite la nueva presentación estableciendo el estilo extendido de la ventana de control de edición como se indica a continuación.

// 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 es otro conjunto de funciones que proporcionan un control preciso para procesar scripts complejos. Para obtener más información, vea Uniscribe.