Поделиться через


Изменение операций текста элемента управления

Система автоматически обрабатывает все операции, инициированные пользователем, и уведомляет приложение о завершении операций.

В следующих разделах рассматриваются текстовые операции, инициированные пользователем, и ответ приложения:

Выбор элемента управления "Изменить"

Пользователь может выбрать элемент управления редактирования, щелкнув его мышью или нажав клавишу TAB, чтобы перейти к нему. Метод табуляции является частью предопределенного интерфейса клавиатуры, который предоставляет система. Полное описание этого интерфейса см . в диалоговом окне. Когда пользователь выбирает элемент управления редактированием, система дает элемент управления фокусом клавиатуры (см. раздел "Фокус клавиатуры и активация" в разделе "О вводе клавиатуры") и выделяет его текст с помощью обратного видео.

Настройка и извлечение текста

Приложение может задать текст элемента управления редактирования с помощью функции SetWindowText, функции SetDlgItemText или отправки элемента управления WM_SETTEXT сообщения.

Чтобы получить весь текст из элемента управления редактированием, сначала используйте функцию GetWindowTextLength или сообщение WM_GETTEXTLENGTH, чтобы определить размер буфера, необходимого для хранения текста. Затем получите текст с помощью функции GetWindowText, функции GetDlgItemText или сообщения WM_GETTEXT.

Выделение текста

После выбора элемента управления редактирования пользователь может выбрать текст в элементе управления с помощью мыши или клавиатуры. Приложение может получить начальные и конечные позиции символов текущего выделенного фрагмента в элементе управления редактирования, отправив элемент управления EM_GETSEL сообщение. Возвращаемое значение для конечной позиции больше последнего символа выделения (т. е. положение первого символа после последнего выбранного символа).

Приложение также может выделить текст в элементе управления редактирования, отправив элемент управления EM_SETSEL сообщение с начальными и конечными индексами символов для выделения. Например, приложение может использовать EM_SETSEL с EM_REPLACESEL для удаления текста из элемента управления редактирования.

Эти три сообщения применяются как к элементам управления однострочного, так и многострочного редактирования.

Замена текста

Приложение может заменить выделенный текст в элементе управления редактирования, отправив элемент управления EM_REPLACESEL сообщение указателем на замещающий текст. Если текущего выделения нет, EM_REPLACESEL вставляет замещающий текст в точку вставки. Приложение может получить код уведомления EN_ERRSPACE , если замещающий текст превышает доступную память. Это сообщение относится как к элементам управления однострочного, так и многострочного редактирования.

Приложение может использовать EM_REPLACESEL для замены части текста элемента управления редактирования или функции SetDlgItemText, чтобы заменить все это.

Изменение шрифта, используемого элементом управления "Изменить"

Приложение может изменить шрифт, который использует элемент управления редактирования, отправив сообщение WM_SETFONT . Большинство приложений делают это при обработке сообщения WM_INITDIALOG . Изменение шрифта не изменяет размер элемента управления редактирования; приложениям, отправляющим сообщение WM_SETFONT , может потребоваться получить метрики шрифта для текста и пересчитывать размер элемента управления редактированием. Дополнительные сведения о шрифтах и метрик шрифтов см. в разделе "Шрифты" и "Текст".

Вырезать операции копирования и очистки

Существует четыре сообщения для перемещения текста между элементом управления редактированием и буфером обмена. Сообщение WM_COPY копирует текущий выбор (если таковой) из элемента управления редактирования в буфер обмена без удаления из элемента управления редактирования. Сообщение WM_CUT удаляет текущий выбор (если таковой) в элементе управления редактированием и копирует удаленный текст в буфер обмена. Сообщение WM_CLEAR удаляет текущий выбор (если таковой) из элемента управления редактированием, но не копирует его в буфер обмена (если пользователь не нажимает клавишу SHIFT). Сообщение WM_PASTE копирует текст из буфера обмена в элемент управления редактирования в точке вставки. Эти четыре сообщения применяются как к элементам управления однострочного, так и многострочного редактирования.

Microsoft Windows NT 4.0 и более поздних версий: элемент управления редактированием включает встроенное контекстное меню, которое упрощает перемещение текста между элементом управления редактированием и буфером обмена. Контекстное меню отображается, когда пользователь щелкает элемент управления правой кнопкой мыши. Команды в контекстном меню включают отмену, вырезать, копировать, вставлять, удалять и выбирать все.

Изменение текста

Пользователь может выбрать, удалить или переместить текст в элементе управления редактирования. Система поддерживает внутренний флаг для каждого элемента управления редактирования, указывающего, было ли изменено содержимое элемента управления. Система очищает этот флаг при создании элемента управления и задает флаг при изменении текста элемента управления. Приложение может получить флаг изменения, отправив элемент управления EM_GETMODIFY сообщение. Затем приложение может задать или очистить флаг изменения, отправив элемент управления EM_SETMODIFY сообщение. Эти сообщения применяются как к элементам управления однострочного, так и многострочного редактирования.

Ограничение введенного пользователем текста

Ограничение по умолчанию на количество текста, которое пользователь может ввести в элементе управления редактированием, равно 32 КБ. Приложение может изменить ограничение по умолчанию, отправив элемент управления EM_SETLIMITTEXT сообщение. Это сообщение задает жесткое ограничение на количество байтов, которое пользователь может ввести в элемент управления редактирования, но не влияет ни на текст, который уже находится в элементе управления, когда сообщение было отправлено, ни текст, скопированный в элемент управления функцией SetDlgItemText или сообщением WM_SETTEXT. Например, предположим, что приложение использует функцию SetDlgItemText для размещения 500 байт в элементе управления редактированием, а пользователь также вводит 500 байт (1000 байт в общей сложности). Если приложение отправляет EM_SETLIMITTEXT сообщение, ограничивающее введенный пользователем текст до 300 байт, 1000 байтов, уже в элементе управления редактирования остаются там, и пользователь не может добавить больше текста. С другой стороны, если приложение отправляет сообщение EM_SETLIMITTEXT , ограничивающее введенный пользователем текст до 1300 байт, остается 1000 байт, но пользователь может добавить 300 больше байтов.

Когда пользователь достигает предела символа элемента управления редактированием, система отправляет приложению сообщение WM_COMMAND, содержащее код уведомления EN_MAXTEXT. Этот код уведомления не означает, что память исчерпана, но достигнуто ограничение для введенного пользователем текста; Пользователь не может вводить больше текста. Чтобы изменить это ограничение, приложение должно отправить элемент управления новый EM_SETLIMITTEXT сообщение с более высоким ограничением.

В качестве примера использования EM_SETLIMITTEXT и EN_MAXTEXT, предположим, что приложение должно ограничить пользователя не более четырех символов в элементе управления редактированием. Приложение будет использовать EM_SETLIMITTEXT для указания четырехзначного ограничения. Если пользователь пытался ввести пятый символ, система отправит код уведомления EN_MAXTEXT в приложение.

Операции символов и строк

Существует несколько сообщений, возвращающих сведения о символах и строках в элементе управления редактированием. Большинство сообщений возвращают индекс, обычно отсчитываемый от нуля, чтобы ссылаться на символ или строку. Например, в элементе управления редактирования с одной строкой, содержающем n символов, индекс строки равен нулю, а символы индексируются от нуля до n-1. В многострочный элемент управления редактирования, содержащий линии m и n символов, строки индексируются от нуля до m-1, а символы индексируются от нуля до n-1. Обратите внимание, что индексирование символов игнорирует разрывы строк.

Приложение может определить количество символов в элементе управления редактирования, отправив WM_GETTEXTLENGTH сообщение в элемент управления редактирования. Это сообщение возвращает длину в символах (не включая завершающий пустой символ) текста в элементе управления редактирования с одной строкой или несколькими строками. Сообщение EM_LINELENGTH возвращает длину в символах строки, указанной индексом символа в строке. Возвращаемая длина не содержит выбранных символов. Приложение может использовать эти сообщения в однострочного или многострочного элемента управления редактирования.

Сообщение EM_GETFIRSTVISIBLELINE возвращает отсчитываемый от нуля индекс самой верхней видимой строки в элементе управления многострочного редактирования или отсчитываемый от нуля индекс первого видимого символа в элементе управления редактирования с одной строкой. Приложение может скопировать строку из элемента управления редактирования в буфер, отправив EM_GETLINE сообщение в элемент управления редактирования. Строка задается индексом строки, а первое слово принимающего буфера содержит максимальное количество байтов, копируемых в буфер. Возвращаемое значение — это количество скопированных байтов. Это сообщение также можно использовать в элементе управления редактирования с одной строкой или несколькими строками.

Существуют уникальные сообщения для возврата сведений о строке в элементе управления многострочный редактирования. Сообщение EM_GETLINECOUNT возвращает количество строк в элементе управления редактированием. Сообщение EM_LINEFROMCHAR возвращает индекс строки, содержащей указанный символьный индекс. Сообщение EM_LINEINDEX возвращает индекс первого символа в указанной строке.

Прокрутка текста в элементе управления "Изменение"

Чтобы реализовать прокрутку в элементе управления редактированием, можно использовать стили автоматической прокрутки, рассмотренные в разделе "Типы и стили редактирования", или явно добавлять полосы прокрутки в элемент управления редактирования. Чтобы добавить горизонтальную полосу прокрутки, используйте стиль WS_HSCROLL; чтобы добавить вертикальную полосу прокрутки, используйте стиль WS_VSCROLL. Элемент управления редактирования с полосами прокрутки обрабатывает собственные сообщения полосы прокрутки. Подробные сведения о добавлении полос прокрутки для редактирования элементов управления см. в разделе " Полосы прокрутки".

Система предоставляет три сообщения, которые приложение может отправлять в элемент управления редактирования с полосами прокрутки. Сообщение EM_LINESCROLL может прокручивать многостроочное управление редактированием как по вертикали, так и по горизонтали. Параметр lParam указывает количество строк для прокрутки по вертикали, начиная с текущей строки, а параметр wParam задает количество символов, которые нужно прокручивать по горизонтали, начиная с текущего символа. Элемент управления редактирования не признает сообщения горизонтальной прокрутки, если он имеет стиль ES_CENTER или ES_RIGHT . Сообщение EM_LINESCROLL применяется только к элементам управления многостроковых правок.

Сообщение EM_SCROLL прокручивает многостроочное элемент управления редактирования по вертикали. Параметр wParam задает действие прокрутки. Сообщение EM_SCROLL применяется только к элементам управления многостроковых правок. EM_SCROLL имеет тот же эффект, что и сообщение WM_VSCROLL.

Сообщение EM_SCROLLCARET прокручивает курсор на представление в элементе управления редактирования.

Настройка стоп-вкладок и полей

Приложение может задать остановки вкладок в элементе управления многостроек редактирования с помощью сообщения EM_SETTABSTOPS. (Значение по умолчанию для остановки табуляции — восемь символов.) Когда приложение добавляет текст в элемент управления редактирования, символы табуляции в тексте автоматически создают пробел до следующей остановки вкладки. Сообщение EM_SETTABSTOPS не приводит к автоматическому перерисовку текста системой. Для этого приложение может вызвать функцию InvalidateRect . Сообщение EM_SETTABSTOPS применяется только к элементам управления многострогового редактирования.

Приложение может задать ширину левого и правого полей для элемента управления редактированием с помощью сообщения EM_SETMARGINS. После отправки этого сообщения система перерисовывает элемент управления редактирования, чтобы отразить новые параметры поля. Приложение может получить ширину левого или правого поля, отправив EM_GETMARGINS сообщение. По умолчанию поля элемента управления редактирования задаются достаточно широко, чтобы вместить самый большой горизонтальный навес (отрицательные ширины ABC) для текущего шрифта, используемого в элементе управления редактированием.

Скрытие ввода пользователей

Приложение может использовать символ пароля в элементе управления редактирования для скрытия ввода пользователей. Если задан символ пароля, он отображается вместо каждого символа, который типы пользователей. При удалении символа пароля элемент управления отображает символы, типы пользователей. Если приложение создает однострочный элемент управления редактированием с помощью стиля ES_PASSWORD, символ пароля по умолчанию является звездочкой (*). Приложение может использовать сообщение EM_SETPASSWORDCHAR для удаления или определения другого символа пароля и сообщения EM_GETPASSWORDCHAR для получения текущего символа пароля. Эти сообщения применяются только к элементам управления редактирования в одной строке.

Использование целых чисел

Существует две функции преобразования целых чисел для элементов управления редактированием, предназначенных только для хранения чисел. Функция SetDlgItemInt создает строковое представление указанного целого числа (подписанного или без знака) и отправляет строку в элемент управления редактирования. SetDlgItemInt не возвращает значение. Функция GetDlgItemInt создает целое число (подписанный или неподписанный) из строкового представления в элементе управления редактирования. GetDlgItemInt возвращает целое число (или значение ошибки).

Отмена текстовых операций

Каждый элемент управления редактирования сохраняет флаг отмены, указывающий, может ли приложение отменить или отменить последнюю операцию в элементе управления редактирования (например, отмена удаления текста). Элемент управления редактирования задает флаг отмены, чтобы указать, что операция может быть отменена и сбрасывает ее, чтобы указать, что операция не может быть отменена. Приложение может определить параметр флага отмены, отправив элемент управления EM_CANUNDO сообщение.

Приложение может отменить последнюю операцию, отправив элемент управления EM_UNDO сообщение. Операция может быть отменена при отсутствии другой операции управления редактированием. Например, пользователь может удалить текст, заменить текст (отменить удаление), а затем снова удалить текст (отменить замену). Сообщение EM_UNDO относится как к элементам управления однострочного, так и многострочного редактирования и всегда работает для элементов управления редактированием в одной строке.

Приложение может сбросить флаг отмены элемента управления редактирования, отправив элемент управления EM_EMPTYUNDOBUFFER сообщение. Система автоматически сбрасывает флаг отмены всякий раз, когда элемент управления редактирования получает EM_SETHANDLE или WM_SETTEXT сообщение. Функция SetDlgItemText отправляет сообщение WM_SETTEXT .

Обработка разрывов wordwrap и строк

Приложение может использовать функции Wordwrap с многостроочными элементами управления редактирования для поиска фрагмента слова или слова, который должен быть заключен в следующую строку. Используя функцию Wordwrap по умолчанию, предоставляемую системой, строки всегда заканчиваются пробелами между словами. Приложение может указать собственную функцию Wordwrap, указав функцию EditWordBreakProc Wordwrap и отправив элемент управления редактированием EM_SETWORDBREAKPROC сообщение. Приложение может получить адрес текущей функции Wordwrap, отправив элемент управления EM_GETWORDBREAKPROC сообщение.

Приложение может направлять элемент управления многострочного редактирования для добавления или удаления символа обратимого разрыва строки (два возврата каретки и веб-канал строки) автоматически в конце строк, упакованных в текст. Приложение может включить или отключить эту функцию, отправив элемент управления редактирования EM_FMTLINES сообщение. Это сообщение относится только к элементам управления многострочный редактирования и не влияет на строку, которая заканчивается жестким разрывом линии (один возврат каретки и канал строки, введенный пользователем). Кроме того, в многостроочных элементах управления редактирования приложение может указать стиль ES_WANTRETURN , чтобы система вставляла каретки, когда пользователь нажимает клавишу ВВОД в элементе управления редактирования.

Получение точек и символов

Чтобы определить символ, ближайший к указанной точке в клиентской области элемента управления редактирования, отправьте EM_CHARFROMPOS сообщение в элемент управления. Сообщение возвращает индекс символа и индекс строки ближайшего к точке символа. Аналогичным образом можно получить координаты клиентской области указанного символа, отправив EM_POSFROMCHAR сообщение. Сообщение возвращает координаты x и y верхнего левого угла указанного символа.

Автозавершение строк

Автозавершение расширяет строки, которые были частично введены в элемент управления редактирования в полные строки. Например, когда пользователь начинает вводить URL-адрес в элементе управления "Изменение адреса", внедренном в панель инструментов Windows Internet Обозреватель, автозавершение расширяет строку на один или несколько полных URL-адресов, которые соответствуют существующей частичной строке. Часть строки URL-адреса, например "микрофон", может быть развернута на "https://www.microsoft.com" или "https://www.microsoft.com/windows"; Автозавершение обычно используется с элементами управления редактирования или с элементами управления с внедренным элементом управления редактирования.

Дополнительные сведения см. в документации по интерфейсу IAutoComplete и IAutoComplete2.

Сложный скрипт в элементах управления "Изменить"

Сложный скрипт — это язык, печатный вид которого не представлен простым способом. Например, сложный скрипт может разрешить двунаправленную отрисовку, контекстное формирование глифов или объединение символов. Стандартные элементы управления редактированием были расширены для поддержки многоязычного текста и сложных скриптов. Это включает не только ввод и отображение, но и правильное перемещение курсора по кластерам символов (например, в скрипте Thai и Devanagari).

Хорошо написанное приложение автоматически получает эту поддержку без изменений. Опять же, следует добавить поддержку порядка чтения справа налево и выравнивания вправо. В этом случае переключите флаги расширенного стиля окна управления для управления этими атрибутами, как показано в следующем примере.

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

После установки значения lAlign включите новое отображение, задав расширенный стиль окна управления редактированием следующим образом.

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