Condividi tramite


Modifica operazioni sul testo del controllo

Il sistema elabora automaticamente tutte le operazioni di testo avviate dall'utente e invia una notifica all'applicazione al termine delle operazioni.

Gli argomenti seguenti illustrano le operazioni di testo avviate dall'utente e la risposta dell'applicazione:

Selezione di un controllo di modifica

L'utente può selezionare un controllo di modifica facendo clic su di esso con il mouse o premendo il tasto TAB per spostarlo. Il metodo di tabulazione fa parte di un'interfaccia della tastiera predefinita fornita dal sistema. Per una descrizione completa di questa interfaccia, vedere Finestre di dialogo. Quando l'utente seleziona un controllo di modifica, il sistema assegna al controllo lo stato attivo della tastiera (vedi "Stato attivo e attivazione della tastiera" in Informazioni sull'input da tastiera) ed evidenzia il testo usando il video inverso.

Impostazione e recupero di testo

Un'applicazione può impostare il testo di un controllo di modifica usando la funzione SetWindowText, la funzione SetDlgItemText o inviando il controllo un messaggio WM_edizione Standard TTEXT.

Per recuperare tutto il testo da un controllo di modifica, usare prima di tutto la funzione GetWindowTextLength o il messaggio WM_GETTEXTLENGTH per determinare le dimensioni del buffer necessarie per contenere il testo. Recuperare quindi il testo usando la funzione GetWindowText, la funzione GetDlgItemText o il messaggio WM_GETTEXT.

Selezione di testo

Dopo aver selezionato un controllo di modifica, l'utente può selezionare il testo nel controllo usando il mouse o la tastiera. Un'applicazione può recuperare le posizioni dei caratteri iniziali e finali della selezione corrente in un controllo di modifica inviando il controllo un messaggio EM_GETedizione Standard L. Il valore restituito per la posizione finale è maggiore dell'ultimo carattere nella selezione, ovvero la posizione del primo carattere dopo l'ultimo carattere selezionato.

Un'applicazione può anche selezionare il testo in un controllo di modifica inviando il controllo un messaggio EM_edizione Standard T edizione Standard L con gli indici di caratteri iniziale e finale per la selezione. Ad esempio, l'applicazione può usare EM_edizione Standard T edizione Standard L con EM_REPLACEedizione Standard L per eliminare il testo da un controllo di modifica.

Questi tre messaggi si applicano sia ai controlli di modifica a riga singola che a più righe.

Sostituzione del testo

Un'applicazione può sostituire il testo selezionato in un controllo di modifica inviando il controllo un messaggio EM_REPLACEedizione Standard L con un puntatore al testo di sostituzione. Se non è presente alcuna selezione corrente, EM_REPLACEedizione Standard L inserisce il testo sostitutivo nel punto di inserimento. L'applicazione può ricevere un codice di notifica EN_ERRSPACE se il testo sostitutivo supera la memoria disponibile. Questo messaggio si applica sia ai controlli di modifica a riga singola che a più righe.

Un'applicazione può usare EM_REPLACEedizione Standard L per sostituire parte del testo di un controllo di modifica o la funzione SetDlgItemText per sostituirla.

Modifica del tipo di carattere utilizzato da un controllo di modifica

Un'applicazione può modificare il tipo di carattere utilizzato da un controllo di modifica inviando il messaggio WM_edizione Standard TFONT. La maggior parte delle applicazioni esegue questa operazione durante l'elaborazione del messaggio di WM_INITDIALOG . La modifica del tipo di carattere non modifica le dimensioni del controllo di modifica; le applicazioni che inviano il messaggio WM_edizione Standard TFONT potrebbero dover recuperare le metriche del tipo di carattere per il testo e ricalcolare le dimensioni del controllo di modifica. Per altre informazioni sui tipi di carattere e sulle metriche dei tipi di carattere, vedere Tipi di carattere e testo.

Taglia incolla e cancella operazioni

Sono disponibili quattro messaggi per lo spostamento del testo tra un controllo di modifica e gli Appunti. Il messaggio WM_COPY copia la selezione corrente (se presente) da un controllo di modifica negli Appunti senza eliminarla dal controllo di modifica. Il messaggio WM_CUT elimina la selezione corrente (se presente) nel controllo di modifica e copia il testo eliminato negli Appunti. Il messaggio WM_CLEAR elimina la selezione corrente (se presente) da un controllo di modifica, ma non la copia negli Appunti (a meno che l'utente non ha premuto il tasto MAIUSC). Il WM_PASTE messaggio copia il testo dagli Appunti in un controllo di modifica nel punto di inserimento. Questi quattro messaggi si applicano sia ai controlli di modifica a riga singola che a più righe.

Microsoft Windows NT 4.0 e versioni successive: un controllo di modifica include un menu di scelta rapida predefinito che semplifica lo spostamento del testo tra il controllo di modifica e gli Appunti. Il menu di scelta rapida viene visualizzato quando l'utente fa clic con il pulsante destro del mouse sul controllo. I comandi nel menu di scelta rapida includono Annulla, Taglia, Copia, Incolla, Elimina e Seleziona tutto.

Modifica del testo

L'utente può selezionare, eliminare o spostare testo in un controllo di modifica. Il sistema gestisce un flag interno per ogni controllo di modifica che indica se il contenuto del controllo è stato modificato. Il sistema cancella questo flag quando crea il controllo e imposta il flag ogni volta che viene modificato il testo nel controllo. Un'applicazione può recuperare il flag di modifica inviando il controllo un messaggio EM_GETMODIFY. L'applicazione può quindi impostare o cancellare il flag di modifica inviando il controllo un messaggio EM_edizione Standard TMODIFY. Questi messaggi si applicano sia ai controlli di modifica a riga singola che a più righe.

Limitazione del testo immesso dall'utente

Il limite predefinito per la quantità di testo che un utente può immettere in un controllo di modifica è di 32 KB. Un'applicazione può modificare il limite predefinito inviando un messaggio EM_edizione Standard TLIMITTEXT. Questo messaggio imposta un limite rigido al numero di byte che l'utente può immettere in un controllo di modifica, ma non influisce sul testo già presente nel controllo quando il messaggio è stato inviato o copiato nel controllo dalla funzione SetDlgItemText o dal messaggio WM_edizione Standard TTEXT. Si supponga, ad esempio, che l'applicazione usi la funzione SetDlgItemText per inserire 500 byte in un controllo di modifica e che l'utente immetta anche 500 byte (1.000 byte totali). Se l'applicazione invia un messaggio EM_edizione Standard TLIMITTEXT che limita il testo immesso dall'utente a 300 byte, i 1.000 byte già presenti nel controllo di modifica rimangono e l'utente non può aggiungere altro testo. D'altra parte, se l'applicazione invia un messaggio EM_edizione Standard TLIMITTEXT che limita il testo immesso dall'utente a 1.300 byte, i 1.000 byte rimangono, ma l'utente può aggiungere altri 300 byte.

Quando l'utente raggiunge il limite di caratteri di un controllo di modifica, il sistema invia all'applicazione un messaggio WM_COMMAND contenente un codice di notifica EN_MAXTEXT. Questo codice di notifica non significa che la memoria è stata esaurita, ma che è stato raggiunto il limite per il testo immesso dall'utente; l'utente non può immettere altro testo. Per modificare questo limite, un'applicazione deve inviare al controllo un nuovo messaggio EM_edizione Standard TLIMITTEXT con un limite superiore.

Come esempio dell'uso di EM_edizione Standard TLIMITTEXT e EN_MAXTEXT, si supponga che l'applicazione debba limitare l'utente a non più di quattro caratteri in un controllo di modifica. L'applicazione userà EM_edizione Standard TLIMITTEXT per specificare un limite di quattro caratteri. Se l'utente ha tentato di immettere un quinto carattere, il sistema invia un codice di notifica EN_MAXTEXT all'applicazione.

Operazioni di caratteri e righe

Esistono diversi messaggi che restituiscono informazioni sui caratteri e le righe in un controllo di modifica. La maggior parte dei messaggi restituisce un indice, in genere un numero in base zero, per fare riferimento a un carattere o a una riga. Ad esempio, in un controllo di modifica a riga singola contenente n caratteri, l'indice di riga è zero e i caratteri vengono indicizzati da zero a n-1. In un controllo di modifica su più righe contenente m righe e n caratteri, le righe vengono indicizzate da zero a m-1 e i caratteri vengono indicizzati da zero a n-1. Si noti che l'indicizzazione dei caratteri ignora le interruzioni di riga.

Un'applicazione può determinare il numero di caratteri in un controllo di modifica inviando il messaggio WM_GETTEXTLENGTH al controllo di modifica. Questo messaggio restituisce la lunghezza, in caratteri (non incluso il carattere Null di terminazione), del testo in un controllo di modifica a riga singola o su più righe. Il messaggio EM_LINELENGTH restituisce la lunghezza, in caratteri, di una riga specificata dall'indice dei caratteri di un carattere nella riga. La lunghezza restituita non include caratteri selezionati. Un'applicazione può usare questi messaggi in un controllo di modifica a riga singola o su più righe.

Il messaggio EM_GETFIRSTVISIBLELINE restituisce l'indice in base zero della riga visibile superiore in un controllo di modifica su più righe o l'indice in base zero del primo carattere visibile in un controllo di modifica a riga singola. Un'applicazione può copiare una riga da un controllo di modifica in un buffer inviando il messaggio EM_GETLINE al controllo di modifica. La riga viene specificata dal relativo indice di riga e la prima parola del buffer ricevente contiene il numero massimo di byte da copiare nel buffer. Il valore restituito è il numero di byte copiati. Questo messaggio può essere usato anche in un controllo di modifica a riga singola o su più righe.

Sono disponibili messaggi univoci per restituire le informazioni su una riga in un controllo di modifica su più righe. Il messaggio EM_GETLINECOUNT restituisce il numero di righe in un controllo di modifica. Il messaggio EM_LINEFROMCHAR restituisce l'indice della riga contenente un indice di caratteri specificato. Il messaggio EM_LINEINDEX restituisce l'indice del primo carattere in una riga specificata.

Scorrimento del testo in un controllo Di modifica

Per implementare lo scorrimento in un controllo di modifica, è possibile utilizzare gli stili di scorrimento automatici descritti in Modifica tipi di controllo e stili oppure aggiungere in modo esplicito barre di scorrimento al controllo di modifica. Per aggiungere una barra di scorrimento orizzontale, utilizzare lo stile WS_HSCROLL; per aggiungere una barra di scorrimento verticale, utilizzare lo stile WS_VSCROLL. Un controllo di modifica con barre di scorrimento elabora i propri messaggi della barra di scorrimento. Per informazioni dettagliate sull'aggiunta di barre di scorrimento per modificare i controlli, vedere Barre di scorrimento.

Il sistema fornisce tre messaggi che un'applicazione può inviare a un controllo di modifica con barre di scorrimento. Il messaggio EM_LINESCROLL può scorrere un controllo di modifica su più righe sia verticalmente che orizzontalmente. Il parametro lParam specifica il numero di righe da scorrere verticalmente a partire dalla riga corrente e il parametro wParam specifica il numero di caratteri da scorrere orizzontalmente, a partire dal carattere corrente. Il controllo di modifica non riconosce i messaggi di scorrimento orizzontale se ha lo stile ES_CENTER o ES_RIGHT. Il messaggio EM_LINESCROLL si applica solo ai controlli di modifica su più righe.

Il messaggio EM_SCROLL scorre verticalmente un controllo di modifica su più righe. Il parametro wParam specifica l'azione di scorrimento. Il messaggio EM_SCROLL si applica solo ai controlli di modifica su più righe. EM_SCROLL ha lo stesso effetto del messaggio di WM_VSCROLL.

Il messaggio EM_SCROLLCARET scorre il cursore nella visualizzazione in un controllo di modifica.

Impostazione di tabulazioni e margini

Un'applicazione può impostare tabulazioni in un controllo di modifica su più righe usando il messaggio EM_edizione Standard TTABSTOPS. L'impostazione predefinita per una tabulazione è di otto caratteri. Quando un'applicazione aggiunge testo al controllo di modifica, i caratteri di tabulazione nel testo generano automaticamente spazio fino alla tabulazione successiva. Il messaggio EM_edizione Standard TTABSTOPS non determina automaticamente il ridisegno del testo da parte del sistema. A tale scopo, un'applicazione può chiamare la funzione InvalidateRect. Il messaggio EM_edizione Standard TTABSTOPS si applica solo ai controlli di modifica su più righe.

Un'applicazione può impostare la larghezza dei margini sinistro e destro per un controllo di modifica usando il messaggio EM_edizione Standard TMARGINS. Dopo l'invio di questo messaggio, il sistema ridisegna il controllo di modifica per riflettere le nuove impostazioni del margine. Un'applicazione può recuperare la larghezza del margine sinistro o destro inviando il messaggio di EM_GETMARGINS . Per impostazione predefinita, i margini del controllo di modifica sono sufficientemente ampi per contenere l'overhang orizzontale del carattere più grande (larghezze ABC negative) per il tipo di carattere corrente utilizzato nel controllo di modifica.

Nascondere l'input dell'utente

Un'applicazione può usare un carattere password in un controllo di modifica per nascondere l'input dell'utente. Quando viene impostato un carattere password, viene visualizzato al posto di ogni carattere digitato dall'utente. Quando viene rimosso un carattere password, il controllo visualizza i caratteri digitati dall'utente. Se l'applicazione crea un controllo di modifica a riga singola usando lo stile ES_PASSWORD, il carattere della password predefinito è un asterisco (*). Un'applicazione può usare il messaggio EM_edizione Standard TPASSWORDCHAR per rimuovere o definire un carattere di password diverso e il messaggio EM_GETPASSWORDCHAR per recuperare il carattere di password corrente. Questi messaggi si applicano solo ai controlli di modifica a riga singola.

Uso di numeri interi

Sono disponibili due funzioni di conversione integer per i controlli di modifica progettati per contenere solo numeri. La funzione SetDlgItemInt crea la rappresentazione di stringa di un intero specificato (con segno o senza segno) e invia la stringa a un controllo di modifica. SetDlgItemInt non restituisce alcun valore. La funzione GetDlgItemInt crea un intero (con segno o senza segno) dalla relativa rappresentazione di stringa in un controllo di modifica. GetDlgItemInt restituisce l'intero (o un valore di errore).

Annullamento delle operazioni di testo

Ogni controllo di modifica mantiene un flag di annullamento che indica se un'applicazione può invertire o annullare l'operazione più recente sul controllo di modifica ,ad esempio annullando un'eliminazione di testo. Il controllo di modifica imposta il flag di annullamento per indicare che l'operazione può essere annullata e la reimposta per indicare che l'operazione non può essere annullata. Un'applicazione può determinare l'impostazione del flag di annullamento inviando il controllo un messaggio di EM_CANUNDO.

Un'applicazione può annullare l'operazione più recente inviando il controllo un messaggio EM_UNDO. Un'operazione può essere annullata se non viene eseguita prima alcuna altra operazione di controllo di modifica. Ad esempio, l'utente può eliminare il testo, sostituire il testo (annullare l'eliminazione) e quindi eliminare nuovamente il testo (annullare la sostituzione). Il messaggio EM_UNDO si applica sia ai controlli di modifica a riga singola che a più righe e funziona sempre per i controlli di modifica a riga singola.

Un'applicazione può reimpostare il flag di annullamento di un controllo di modifica inviando il controllo un messaggio di EM_EMPTYUNDOBUFFER . Il sistema reimposta automaticamente il flag di annullamento ogni volta che un controllo di modifica riceve un messaggio EM_edizione Standard THANDLE o WM_edizione Standard TTEXT. La funzione SetDlgItemText invia un messaggio WM_edizione Standard TTEXT.

Gestione di wordwrap e interruzioni di riga

Un'applicazione può usare le funzioni Wordwrap con controlli di modifica su più righe per individuare la parola o il frammento di parola che deve essere racchiuso nella riga successiva. Usando la funzione Wordwrap predefinita fornita dal sistema, le righe terminano sempre in corrispondenza degli spazi tra le parole. Un'applicazione può specificare la propria funzione Wordwrap specificando una funzione EditWordBreakProc Wordwrap e inviando il controllo di modifica un messaggio EM_edizione Standard TWORDBREAKPROC. Un'applicazione può recuperare l'indirizzo della funzione Wordwrap corrente inviando il controllo un messaggio EM_GETWORDBREAKPROC.

Un'applicazione può indirizzare un controllo di modifica su più righe per aggiungere o rimuovere automaticamente un carattere di interruzione linea temporanea (due ritorni a capo e un avanzamento riga) alla fine delle righe di testo a capo. Un'applicazione può attivare o disattivare questa funzionalità inviando il controllo di modifica un messaggio di EM_FMTLINES. Questo messaggio si applica solo ai controlli di modifica su più righe e non influisce su una riga che termina con un'interruzione di riga rigida (un ritorno a capo e un feed di riga immesso dall'utente). Inoltre, nei controlli di modifica su più righe, un'applicazione può specificare lo stile ES_WANTRETURN per richiedere che il sistema inserisca un ritorno a capo quando l'utente preme il tasto INVIO nel controllo di modifica.

Recupero di punti e caratteri

Per determinare il carattere più vicino a un punto specificato nell'area client di un controllo di modifica, inviare il messaggio EM_CHARFROMPOS al controllo. Il messaggio restituisce l'indice di caratteri e l'indice di riga del carattere più vicino al punto. Analogamente, è possibile recuperare le coordinate dell'area client di un carattere specificato inviando il messaggio di EM_POSFROMCHAR. Il messaggio restituisce le coordinate x e y dell'angolo superiore sinistro del carattere specificato.

Completamento automatico delle stringhe

Il completamento automatico espande le stringhe parzialmente immesse in un controllo di modifica in stringhe complete. Ad esempio, quando un utente inizia a immettere un URL nel controllo Modifica indirizzo incorporato nella barra degli strumenti di Windows Internet Explorer, il completamento automatico espande la stringa in uno o più URL completi coerenti con la stringa parziale esistente. Una stringa di URL parziale, ad esempio "mic", potrebbe essere espansa in "https://www.microsoft.com" o "https://www.microsoft.com/windows". Il completamento automatico viene in genere usato con i controlli di modifica o con controlli con un controllo di modifica incorporato.

Per altre informazioni, vedere la documentazione dell'interfaccia IAutoComplete e IAutoComplete2.

Script complesso nei controlli di modifica

Uno script complesso è un linguaggio il cui formato stampato non è disposto in modo semplice. Ad esempio, uno script complesso può consentire il rendering bidirezionale, la forma contestuale dei glifi o la combinazione di caratteri. I controlli di modifica standard sono stati estesi per supportare testo multilingue e script complessi. Ciò include non solo l'input e la visualizzazione, ma anche il corretto spostamento del cursore sui cluster di caratteri (ad esempio, nello script Thai e Devanagari).

Un'applicazione ben scritta riceve automaticamente questo supporto, senza modifiche. Anche in questo caso, è consigliabile aggiungere il supporto per l'ordine di lettura da destra a sinistra e l'allineamento destro. In questo caso, attivare o disattivare i flag di stile estesi della finestra di controllo di modifica per controllare questi attributi, come illustrato nell'esempio seguente.

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

Dopo aver impostato il valore lAlign , abilitare la nuova visualizzazione impostando lo stile esteso della finestra di controllo di modifica come indicato di seguito.

// 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 è un altro set di funzioni che forniscono un controllo corretto per l'elaborazione di script complessi. Per altre informazioni, vedere Uniscribe.