Edytowanie operacji tekstowych kontrolki
System automatycznie przetwarza wszystkie operacje tekstowe inicjowane przez użytkownika i powiadamia aplikację po zakończeniu operacji.
W poniższych tematach omówiono operacje tekstowe inicjowane przez użytkownika i odpowiedź aplikacji:
- wybieranie kontrolki edycji
- ustawienie i pobieranie tekstu
- wybieranie tekstu
- zastępowanie tekstu
- zmienianie czcionki używanej przez kontrolkę edycji
- wycinanie operacji wklejania i czyszczenia kopii
- modyfikowanie tekstu
- ograniczanie tekstu wprowadzonego przez użytkownika
- operacje na znakach i wierszach
- przewijanie tekstu w kontrolki edycji
- ustawienie tabulatorów i marginesów
- ukrywanie danych wejściowych użytkownika
- przy użyciu liczb całkowitych
- cofanie operacji tekstowych
- obsługa zawijania i podziałów wierszy
- pobieranie punktów i znaków
- autouzupełnianie ciągów
- złożony skrypt w edycji kontrolek
Wybieranie kontrolki edycji
Użytkownik może wybrać kontrolkę edycji, klikając ją myszą lub naciskając TAB, aby przejść do niej. Metoda tabulacji jest częścią wstępnie zdefiniowanego interfejsu klawiatury, który zapewnia system. Aby uzyskać pełny opis tego interfejsu, zobacz okna dialogowe. Gdy użytkownik wybierze kontrolkę edycji, system nadaje kontrolce fokus klawiatury (zobacz "Fokus klawiatury i aktywacja" w Informacje o danych wejściowych klawiatury) i wyróżnia tekst przy użyciu odwrotnego wideo.
Ustawianie i pobieranie tekstu
Aplikacja może ustawić tekst kontrolki edycji przy użyciu funkcji SetWindowText, SetDlgItemText lub wysyłając kontrolkę komunikat WM_SETTEXT.
Aby pobrać cały tekst z kontrolki edycji, najpierw użyj funkcjiGetWindowTextLength lub komunikatu WM_GETTEXTLENGTH w celu określenia rozmiaru buforu potrzebnego do przechowywania tekstu. Następnie pobierz tekst przy użyciu funkcji GetWindowText, funkcji GetDlgItem Text lub komunikatu WM_GETTEXT.
Wybieranie tekstu
Po wybraniu kontrolki edycji użytkownik może wybrać tekst w kontrolce przy użyciu myszy lub klawiatury. Aplikacja może pobrać pozycje znaków początkowych i końcowych bieżącego zaznaczenia w kontrolce edycji, wysyłając kontrolkę komunikat EM_GETSEL. Wartość zwracana dla pozycji końcowej jest większa niż ostatni znak w zaznaczeniu (czyli pozycja pierwszego znaku po ostatnim wybranym znaku).
Aplikacja może również zaznaczyć tekst w kontrolce edycji, wysyłając kontrolkę komunikat EM_SETSEL z indeksami znaków początkowych i końcowych dla zaznaczenia. Na przykład aplikacja może użyć EM_SETSEL z EM_REPLACESEL, aby usunąć tekst z kontrolki edycji.
Te trzy komunikaty dotyczą kontrolek edycji jednowierszowej i wielowierszowej.
Zastępowanie tekstu
Aplikacja może zastąpić zaznaczony tekst w kontrolce edycji, wysyłając kontrolkę komunikat EM_REPLACESEL wskaźnikiem do tekstu zastępczego. Jeśli nie ma bieżącego zaznaczenia, EM_REPLACESEL wstawia tekst zastępczy w punkcie wstawiania. Aplikacja może otrzymać kod powiadomienia EN_ERRSPACE, jeśli tekst zastępczy przekracza dostępną pamięć. Ten komunikat dotyczy zarówno kontrolek edycji jednowierszowej, jak i wielowierszowej.
Aplikacja może użyć EM_REPLACESEL, aby zastąpić część tekstu kontrolki edycji lub SetDlgItemText, aby zastąpić wszystkie.
Zmienianie czcionki używanej przez kontrolkę edycji
Aplikacja może zmienić czcionkę używaną przez kontrolkę edycji, wysyłając komunikat WM_SETFONT. Większość aplikacji robi to podczas przetwarzania komunikatu WM_INITDIALOG. Zmiana czcionki nie zmienia rozmiaru kontrolki edycji; aplikacje, które wysyłają komunikat WM_SETFONT, mogą wymagać pobrania metryk czcionek dla tekstu i ponownego obliczenia rozmiaru kontrolki edycji. Aby uzyskać więcej informacji na temat czcionek i metryk czcionek, zobacz Czcionki i tekst.
Wycinanie operacji kopiowania i wklejania i czyszczenia
Istnieją cztery komunikaty do przenoszenia tekstu między kontrolką edycji a schowek. Komunikat WM_COPY kopiuje bieżące zaznaczenie (jeśli istnieje) z kontrolki edycji do schowka bez usuwania go z kontrolki edycji. Komunikat WM_CUT usuwa bieżące zaznaczenie (jeśli istnieje) w kontrolce edycji i kopiuje usunięty tekst do schowka. Komunikat WM_CLEAR usuwa bieżące zaznaczenie (jeśli istnieje) z kontrolki edycji, ale nie kopiuje go do schowka (chyba że użytkownik nacisnął SHIFT). Komunikat WM_PASTE kopiuje tekst ze schowka do kontrolki edycji w punkcie wstawiania. Te cztery komunikaty dotyczą kontrolek edycji jednowierszowej i wielowierszowej.
System Microsoft Windows NT 4.0 lub nowszy: kontrolka edycji zawiera wbudowane menu kontekstowe, które ułatwia użytkownikowi przenoszenie tekstu między kontrolką edycji a schowkiem. Menu kontekstowe jest wyświetlane, gdy użytkownik kliknie kontrolkę prawym przyciskiem myszy. Polecenia w menu kontekstowym obejmują Cofnij, Wycinanie, Kopiowanie, Wklej, Usuńi Wybierz wszystko.
Modyfikowanie tekstu
Użytkownik może wybrać, usunąć lub przenieść tekst w kontrolce edycji. System utrzymuje wewnętrzną flagę dla każdej kontrolki edycji wskazującą, czy zawartość kontrolki została zmodyfikowana. System czyści tę flagę podczas tworzenia kontrolki i ustawia flagę za każdym razem, gdy tekst w kontrolce zostanie zmodyfikowany. Aplikacja może pobrać flagę modyfikacji, wysyłając kontrolkę komunikat EM_GETMODIFY. Następnie aplikacja może ustawić lub wyczyścić flagę modyfikacji, wysyłając kontrolkę EM_SETMODIFY komunikat. Te komunikaty dotyczą kontrolek edycji jednowierszowej i wielowierszowej.
Ograniczanie wprowadzonego tekstu przez użytkownika
Domyślny limit ilości tekstu, który użytkownik może wprowadzić w kontrolce edycji, wynosi 32 KB. Aplikacja może zmienić domyślny limit, wysyłając kontrolkę komunikat EM_SETLIMITTEXT. Ten komunikat ustawia twardy limit liczby bajtów, które użytkownik może wprowadzić do kontrolki edycji, ale nie ma wpływu na tekst, który jest już w kontrolce, gdy wiadomość została wysłana, ani tekst skopiowany do kontrolki przez funkcję SetDlgItemText lub komunikat WM_SETTEXT. Załóżmy na przykład, że aplikacja używa funkcji SetDlgItemText, aby umieścić 500 bajtów w kontrolce edycji, a użytkownik wprowadza również 500 bajtów (łącznie 1000 bajtów). Jeśli aplikacja wysyła komunikat EM_SETLIMITTEXT ograniczający tekst wprowadzony przez użytkownika do 300 bajtów, 1000 bajtów już w kontrolce edycji pozostanie tam, a użytkownik nie może dodać więcej tekstu. Z drugiej strony, jeśli aplikacja wysyła komunikat EM_SETLIMITTEXT ograniczający tekst wprowadzony przez użytkownika do 1300 bajtów, 1000 bajtów pozostanie, ale użytkownik może dodać 300 bajtów więcej bajtów.
Gdy użytkownik osiągnie limit znaków kontrolki edycji, system wysyła aplikacji komunikat WM_COMMAND zawierający kod powiadomienia EN_MAXTEXT. Ten kod powiadomienia nie oznacza, że pamięć została wyczerpana, ale osiągnięto limit tekstu wprowadzonego przez użytkownika; użytkownik nie może wprowadzić więcej tekstu. Aby zmienić ten limit, aplikacja musi wysłać do kontrolki nowy komunikat EM_SETLIMITTEXT z wyższym limitem.
Jako przykład użycia EM_SETLIMITTEXT i EN_MAXTEXTzałóżmy, że aplikacja musi ograniczyć użytkownikowi do nie więcej niż czterech znaków w kontrolce edycji. Aplikacja będzie używać EM_SETLIMITTEXT do określenia limitu czterech znaków. Jeśli użytkownik próbował wprowadzić piąty znak, system wyśle do aplikacji kod powiadomienia EN_MAXTEXT.
Operacje na znakach i wierszach
Istnieje kilka komunikatów, które zwracają informacje o znakach i wierszach w kontrolce edycji. Większość komunikatów zwraca indeks, zwykle liczbę opartą na zerach, aby odwoływać się do znaku lub wiersza. Na przykład w kontrolce edycji jednowierszowej, która zawiera n znaków, indeks wiersza wynosi zero, a znaki są indeksowane od zera do n-1. W wielowierszowej kontrolce edycji zawierającej wiersze m i n znaków wiersze są indeksowane od zera do m-1, a znaki są indeksowane od zera do n-1. Pamiętaj, że indeksowanie znaków ignoruje podziały wierszy.
Aplikacja może określić liczbę znaków w kontrolce edycji, wysyłając komunikat WM_GETTEXTLENGTH do kontrolki edycji. Ta wiadomość zwraca długość w znakach (bez znaku zerowego zakończenia) tekstu w kontrolce edycji jednowierszowej lub wielowierszowej. Komunikat EM_LINELENGTH zwraca długość w znakach wiersza określonego przez indeks znaków znaku w wierszu. Zwrócona długość nie zawiera żadnych zaznaczonych znaków. Aplikacja może używać tych komunikatów w jednowierszowej lub wielowierszowej kontrolce edycji.
Komunikat EM_GETFIRSTVISIBLELINE zwraca indeks oparty na zera najbardziej widocznej górnej linii w wielowierszowej kontrolce edycji lub indeks oparty na zera pierwszego widocznego znaku w kontrolce edycji jednowierszowej. Aplikacja może skopiować wiersz z kontrolki edycji do buforu, wysyłając komunikat EM_GETLINE do kontrolki edycji. Wiersz jest określony przez jego indeks wiersza, a pierwsze słowo buforu odbierającego zawiera maksymalną liczbę bajtów do skopiowania do buforu. Zwracana wartość to liczba skopiowanych bajtów. Ten komunikat może być również używany w kontrolce edycji jednowierszowej lub wielowierszowej.
Dostępne są unikatowe komunikaty umożliwiające zwrócenie informacji o wierszu w wielowierszowej kontrolce edycji. Komunikat EM_GETLINECOUNT zwraca liczbę wierszy w kontrolce edycji. Komunikat EM_LINEFROMCHAR zwraca indeks wiersza zawierającego określony indeks znaków. Komunikat EM_LINEINDEX zwraca indeks pierwszego znaku w określonym wierszu.
Przewijanie tekstu w kontrolce edycji
Aby zaimplementować przewijanie w kontrolce edycji, możesz użyć automatycznych stylów przewijania omówionych w Edytowanie typów kontrolek i stylówlub jawnie dodać paski przewijania do kontrolki edycji. Aby dodać poziomy pasek przewijania, użyj stylu WS_HSCROLL; aby dodać pionowy pasek przewijania, użyj stylu WS_VSCROLL. Kontrolka edycji z paskami przewijania przetwarza własne komunikaty paska przewijania. Aby uzyskać szczegółowe informacje na temat dodawania pasków przewijania do kontrolek edycji, zobacz Paski przewijania.
System udostępnia trzy komunikaty, które aplikacja może wysyłać do kontrolki edycji z paskami przewijania. Komunikat EM_LINESCROLL może przewijać wielowierszową kontrolkę edycji zarówno w pionie, jak i w poziomie. Parametr lParam określa liczbę wierszy do przewijania w pionie począwszy od bieżącego wiersza, a parametr wParam określa liczbę znaków do przewijania w poziomie, zaczynając od bieżącego znaku. Kontrolka edycji nie potwierdza komunikatów przewijania poziomego, jeśli ma styl ES_CENTER lub ES_RIGHT. Komunikat EM_LINESCROLL dotyczy tylko kontrolek edycji wielowierszowej.
Komunikat EM_SCROLL przewija wielowierszową kontrolkę edycji w pionie. Parametr wParam określa akcję przewijania. Komunikat EM_SCROLL dotyczy tylko kontrolek edycji wielowierszowej. EM_SCROLL ma taki sam efekt jak komunikat WM_VSCROLL.
Komunikat EM_SCROLLCARET przewija karetki do widoku w kontrolce edycji.
Ustawianie tabulatorów i marginesów
Aplikacja może ustawić tabulatory w wielowierszowej kontrolce edycji przy użyciu komunikatu EM_SETTABSTOPS. (Wartość domyślna dla zatrzymania karty to osiem znaków). Gdy aplikacja dodaje tekst do kontrolki edycji, znaki tabulacji w tekście automatycznie generują miejsce do następnego zatrzymania karty. Komunikat EM_SETTABSTOPS nie powoduje automatycznego przerysowania tekstu przez system. W tym celu aplikacja może wywołać funkcję InvalidateRect. Komunikat EM_SETTABSTOPS dotyczy tylko kontrolek edycji wielowierszowej.
Aplikacja może ustawić szerokość lewego i prawego marginesu kontrolki edycji przy użyciu komunikatu EM_SETMARGINS. Po wysłaniu tego komunikatu system ponownie wyrysuje kontrolkę edycji, aby odzwierciedlić nowe ustawienia marginesu. Aplikacja może pobrać szerokość lewego lub prawego marginesu, wysyłając komunikat EM_GETMARGINS. Domyślnie marginesy kontrolki edycji są ustawiane na tyle szeroki, aby pomieścić największy znak wysięg poziomy (ujemne szerokości ABC) dla bieżącej czcionki używanej w kontrolce edycji.
Ukrywanie danych wejściowych użytkownika
Aplikacja może użyć znaku hasła w kontrolce edycji, aby ukryć dane wejściowe użytkownika. Po ustawieniu znaku hasła jest wyświetlany zamiast każdego znaku typ użytkownika. Po usunięciu znaku hasła kontrolka wyświetla znaki, które użytkownik wpisze. Jeśli aplikacja tworzy kontrolkę edycji jednowierszowej przy użyciu stylu ES_PASSWORD, domyślnym znakiem hasła jest gwiazdka (*). Aplikacja może użyć komunikatu EM_SETPASSWORDCHAR, aby usunąć lub zdefiniować inny znak hasła oraz komunikat EM_GETPASSWORDCHAR w celu pobrania bieżącego znaku hasła. Te komunikaty dotyczą tylko kontrolek edycji jednowierszowej.
Używanie liczb całkowitych
Istnieją dwie funkcje konwersji liczb całkowitych dla kontrolek edycji zaprojektowanych tak, aby zawierały tylko liczby. Funkcja SetDlgItemInt tworzy reprezentację ciągu określonej liczby całkowitej (podpisanej lub niepodpisanej) i wysyła ciąg do kontrolki edycji. SetDlgItemInt nie zwraca żadnej wartości. Funkcja GetDlgItemInt tworzy liczbę całkowitą (podpisaną lub niepodpisaną) z reprezentacji ciągu w kontrolce edycji. GetDlgItemInt zwraca liczbę całkowitą (lub wartość błędu).
Cofanie operacji tekstowych
Każda kontrolka edycji zachowuje flagę cofania, która wskazuje, czy aplikacja może cofnąć lub cofnąć najnowszą operację w kontrolce edycji (na przykład cofanie usuwania tekstu). Kontrolka edycji ustawia flagę cofania, aby wskazać, że można cofnąć operację i zresetować ją, aby wskazać, że nie można cofnąć operacji. Aplikacja może określić ustawienie flagi cofania, wysyłając kontrolkę komunikat EM_CANUNDO.
Aplikacja może cofnąć najnowszą operację, wysyłając kontrolkę EM_UNDO komunikatu. Można cofnąć operację, pod warunkiem, że żadna inna operacja kontroli edycji nie jest wykonywana jako pierwsza. Na przykład użytkownik może usunąć tekst, zastąpić tekst (cofnąć usunięcie), a następnie ponownie usunąć tekst (cofnąć zastąpienie). Komunikat EM_UNDO dotyczy zarówno kontrolek edycji jednowierszowej, jak i wielowierszowej i zawsze działa w przypadku kontrolek edycji jednowierszowej.
Aplikacja może zresetować flagę cofania kontrolki edycji, wysyłając kontrolkę EM_EMPTYUNDOBUFFER komunikat. System automatycznie resetuje flagę cofania za każdym razem, gdy kontrolka edycji odbiera komunikat EM_SETHANDLE lub WM_SETTEXT. Funkcja SetDlgItemText wysyła komunikat WM_SETTEXT.
Obsługa zawijania i podziałów wierszy
Aplikacja może używać funkcji Wordwrap z wielowierszowymi kontrolkami edycji w celu zlokalizowania fragmentu wyrazu lub wyrazu, który powinien zostać opakowany do następnego wiersza. Używając domyślnej funkcji Wordwrap udostępnianej przez system, linie zawsze kończą się spacjami między wyrazami. Aplikacja może określić własną funkcję Wordwrap, podając EditWordBreakProc funkcji Wordwrap i wysyłając kontrolkę edycji komunikat EM_SETWORDBREAKPROC. Aplikacja może pobrać adres bieżącej funkcji Wordwrap, wysyłając kontrolkę EM_GETWORDBREAKPROC komunikat.
Aplikacja może kierować wielowierszową kontrolkę edycji w celu dodania lub usunięcia znaku podziału linii miękkiej (powrotu dwóch karetek i kanału informacyjnego) automatycznie na końcu zawiniętych linii tekstowych. Aplikacja może włączyć lub wyłączyć tę funkcję, wysyłając kontrolkę edycji komunikat EM_FMTLINES. Ten komunikat dotyczy tylko kontrolek edycji wielowierszowej i nie ma wpływu na wiersz kończący się twardym podziałem wiersza (jeden powrót karetki i kanał informacyjny wiersza wprowadzony przez użytkownika). Ponadto w wielowierszowych kontrolkach edycji aplikacja może określić styl ES_WANTRETURN, aby zażądać, aby system wstawić karetki zwracany, gdy użytkownik naciska ENTER w kontrolce edycji.
Pobieranie punktów i znaków
Aby określić znak najbliżej określonego punktu w obszarze klienta kontrolki edycji, wyślij komunikat EM_CHARFROMPOS do kontrolki. Komunikat zwraca indeks znaków i indeks wiersza znaku najbliższego punktu. Podobnie można pobrać współrzędne obszaru klienta określonego znaku, wysyłając komunikat EM_POSFROMCHAR. Komunikat zwraca współrzędne x i y lewego górnego rogu określonego znaku.
Autouzupełnianie ciągów
Autouzupełnianie rozszerza ciągi, które zostały częściowo wprowadzone w kontrolce edycji do pełnych ciągów. Na przykład gdy użytkownik zacznie wprowadzać adres URL w kontrolce Edycja adresu osadzona na pasku narzędzi programu Windows Internet Explorer, autouzupełnianie rozszerza ciąg na co najmniej jeden pełny adres URL zgodny z istniejącym ciągiem częściowym. Częściowy ciąg adresu URL, taki jak "mic", może zostać rozszerzony na "https://www.microsoft.com" lub "https://www.microsoft.com/windows". Autouzupełnianie jest zwykle używane z kontrolkami edycji lub kontrolkami z osadzoną kontrolką edycji.
Aby uzyskać więcej informacji, zobacz dokumentację interfejsu IAutoComplete IAutoComplete iIAutoComplete2.
Złożony skrypt w kontrolkach edycji
złożony skrypt jest językiem, którego formularz drukowany nie jest rozmieszczony w prosty sposób. Na przykład złożony skrypt może zezwalać na renderowanie dwukierunkowe, kształtowanie kontekstowe glifów lub łączenie znaków. Standardowe kontrolki edycji zostały rozszerzone w celu obsługi wielojęzycznego tekstu i złożonych skryptów. Dotyczy to nie tylko danych wejściowych i wyświetlanych, ale także poprawnego przenoszenia kursora przez klastry znaków (na przykład w skrypcie tajskim i devanagari).
Dobrze napisana aplikacja automatycznie otrzymuje tę obsługę bez modyfikacji. Ponownie należy rozważyć dodanie obsługi kolejności odczytu od prawej do lewej i wyrównania do prawej. W tym przypadku przełącz flagi stylu rozszerzonego okna kontrolki edycji, aby kontrolować te atrybuty, jak pokazano w poniższym przykładzie.
// 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 ;
Po ustawieniu wartości lAlign włącz nowy ekran, ustawiając rozszerzony styl okna kontrolki edycji w następujący sposób.
// 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 to kolejny zestaw funkcji, które zapewniają precyzyjną kontrolę przetwarzania złożonych skryptów. Aby uzyskać więcej informacji, zobacz Uniscribe.