Классы стандартных элементов управления. Текстовое поле
Классы стандартных элементов управления. Текстовое поле
Классы стандартных элементов управления. Текстовое
поле
Генеалогия
Читаем, пишем, смотрим...
Класс CEdit позволяет создать такой элемент управления Windows, как
"текстовое поле", который является простейшим редактором текста. Он представляет
собой прямоугольное дочернее окно, в которое можно вводить текст. Когда фокус
ввода принадлежит текстовому полю, пользователь может вводить в нем текст,
редактировать его, перемещать курсор по тексту, выделять текст, копировать его в
буфер обмена и обратно. Используя класс CEdit, можно создать как многострочный
редактор текста, так и просто поля для ввода текста.
В большинстве случаев, особенно когда текстовое поле используется для поля
ввода, он функционирует автономно - приложение запрашивает введенный текст на
момент запроса, никак не контролируя сам процесс ввода информации. Однако
"текстовое поле" предусматривает уведомления (извещения) родительского окна о
некоторых событиях. Для связывания функций обработки уведомлений предусмотрены
макросы, добавляющие обработчик в карту сообщений родительского окна, созданного
на базе производных классов от класса CWnd. Все эти макросы перечислены ниже
совместно с описанием соответствующих уведомляющих сообщений:
// ON_EN_CHANGE - пользователь произвел действие, которое, возможно,
// изменило текст в текстовом поле, в отличие от сообщения EN_UPDATE,
// это сообщение посылается после того, как Windows уже обновила окно
// текстового поля.
// ON_EN_ERRSPACE - элемент управления не может получить достаточно памяти
// для размещения текста.
// ON_EN_HSCROLL - пользователь щелкнул по горизонтальной полосе прокрутки
// текстового поля. Родительское окно уведомляется до того, как будет
// произведено обновление экрана.
// ON_EN_KILLFOCUS - текстовое поле теряет фокус ввода.
// ON_EN_MAXTEXT - текущая вставка превышает заданное число символов для
// текстового поля и поэтому она усечена; сообщение посылается, если не
// установлен стиль ES_AUTOHSCROLL, и число символов для вставки превышает
// ширину текстового поля, также посылается, если не установлен стиль
// ES_AUTOVSCROLL, и высота общего числа строк с текстом для вставки
// превышает высоту окна текстового поля.
// ON_EN_SETFOCUS - посылается, когда текстовое поле получает фокус ввода.
// ON_EN_UPDATE - сообщает, что текстовое поле собирается отобразить
// измененный текст на экране, посылается, когда элемент управления уже
// отформатировал текст, но еще не вывел изменения на экране (с тем, чтобы
// можно было в случае необходимости изменить размеры окна).
// ON_EN_VSCROLL - пользователь щелкнул по вертикальной полосе прокрутки
// текстового поля. Родительское окно уведомляется до того, как будет
// произведено обновление экрана.
Инициализация
CEdit( ); // Конструктор по умолчанию
BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
// Создает текстовое поле и присоединяет его к объекту CEdit. В случае
// успешного завершения функция возвращает истину.
// Параметры:
// dwStyle - стили создаваемого текстового поля. Можно комбинировать
// следующие стили:
// ES_AUTOHSCROLL - текстовое поле автоматически прокручивает текст вправо
// на 10 символов, если пользователь вводит символ в конце строки; если
// пользователь нажимает клавишу ввода, то происходит переход к началу
// следующей строки.
// ES_AUTOVSCROLL - автоматически прокручивает текст на одну строку, если
// пользователь нажал клавишу ввода на последней строке.
// ES_CENTER - центрирует текст в многострочном текстовом поле.
// ES_LEFT - выравнивает текст по левому краю.
// ES_LOWERCASE - все символы, набираемые в текстовом поле, преобразуются
// в строчные.
// ES_MULTILINE - задает многострочное текстовое поле (по умолчанию
// создается однострочное текстовое поле). Если был задан стиль
// ES_AUTOVSCROLL, то текстовое поле прокручивает по необходимости текст
// по вертикали, если этот стиль не задан, то текстовое поле показывает
// столько символов, сколько помещается в окне, а затем выдает звуковой
// сигнал о том, что места для ввода уже нет. Если был задан стиль
// ES_AUTOHSCROLL, то многострочное текстовое поле автоматически
// прокручивает текст по горизонтали, пока каретка не достигает правого
// края окна; чтобы продолжить ввод пользователь должен нажать клавишу
// ввода. Если этот стиль не задан, то текстовое поле автоматически
// переносит слова на начало новой строки. Перенос слов определяется
// размерами окна.
// ES_NOHIDESEL - текстовое поле снимает выделение с текта, если теряет
// фокус ввода и вновь устанавливает его при получении; задание этого
// стиля отключаетописанную возможность, используемую по умолчанию.
// ES_NUMBER - позволяет вводить в текстовое поле только цифры.
// ES_OEMCONVERT - текст, вводимый в текстовое поле, конвертируется из
// набора символов ANSI в набор символов OEM; при передаче из текстового
// поля текст конвертируется в набор ANSI.
// ES_PASSWORD - все символы, набираемые в текстовом поле, отображаются
// специальным символом (по умолчанию "*").
// ES_RIGHT - выравнивает текст по правому краю.
// ES_UPPERCASE - все символы, набираемые в текстовом поле, преобразуются
// в прописные.
// ES_READONLY - текст в текстовом поле доступен только для чтения.
// ES_WANTRETURN - устанавливает режим, при котором нажатие клавиши Enter
// должен вставляться символ возврата каретки; этот стиль не действует в
// однострочном текстовом поле. При отсутствии этого стиля нажатие Enter
// приведет к выполнению команды, заданной по умолчанию (чтобы этого
// избежать нажимайте Ctrl+Enter).
// rect - задает размер и расположение текстового поля.
// pParentWnd - задает родительское окно (обычно это CDialog).
// nID - идентификатор текстового поля.
Выделение текста
void GetSel( int& nStartChar, int& nEndChar );
// В nStartChar записывается позиция первого выделенного элемента,
// В nEndChar записывается позиция первого невыделенного элемента строки
// (следующего за выделенным текстом).
void SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE );
// nStartChar задает начальную позицию выделения, если nStartChar = 0
// и nEndChar = -1, то весь текст в текстовом поле будет выделен, если
// nStartChar = -1, то выделение в текстовом поле будет снято. nEndChar
// задает конечную позицию выделения. Если bNoScroll = FALSE, то каретка
// устанавливается в зону видимости (выполняется прокрутка текста), если
// TRUE - не устанавливается.
void ReplaceSel( LPCTSTR lpszNewText );
// Замещает выделенный текст в текстовом поле строкой lpszNewText. Если
// выделения не было, вставляет текст в текущую позицию. Для замены
// всего текста целиком лучше использовать функцию SetWindowText.
Работа со строками
int GetFirstVisibleLine( );
// Возвращает индекс самой верхней видимой строки в редакторе. Для
// однострочного редактора возвращается 0.
void LineScroll( int nLines, int nChars = 0 );
// Прокручивает текст в многострочном текстовом поле; nLines - число
// строк, которые должны быть прокручены по вертикали; nChars - задает
// число символов для прокрутки по горизонтали. Этот параметр
// игнорируется, когда текстовое поле имеет стили ES_RIGHT или ES_CENTER.
// Знак этих параметров указывает направление прокрутки: отрицательные
// значения приводят к прокрутке вверх и влево, а положительные вниз и
// вправо соответственно.
// Данная функция работает только для многострочных текстовых полей.
int LineFromChar( int nIndex = -1 );
// Позволяет получить номер строки, содержащей заданный символьный индекс,
// где под символьным индексом понимается число символов от начала текста,
// содержащегося в текстовом поле. Если параметр nIndex = -1, то
// возвращается номер строки, содержащей первый символ выделенного текста.
// Если же в текстовом поле нет выделенного текста, то в этом случае будет
// возврашен номер текущей строки.
// Данная функция работает только для многострочных текстовых полей.
int LineLength( int nLine = -1 );
// Определяет длину строки в текстовом поле. Когда функция вызывается для
// многострочного текстового поля, возвращается длина строки в байтах,
// заданной параметром nLine. Когда функция вызывается для однострочного
// текстового поля, возвращается длина текущей строки в байтах. Если
// nLine = -1, то возвращается длина текущей строки, не включая длину
// любого выделенного в строке текста. Когда функция вызывается для
// однострочного текстового поля этот параметр игнорируется.
int LineIndex( int nLine = -1 );
// Возвращает символьный индекс, заданной параметр, или -1, если заданный
// индекс больше чем общее число строк в текстовом поле.
// Данная функция работает только для многострочных текстовых полей.
int GetLineCount() const;
// Возвращает количество строк в текстовом поле, если строк нет - единицу.
// Данная функция работает только для многострочных текстовых полей.
int GetLine( int nIndex, LPTSTR lpszBuffer );
int GetLine( int nIndex, LPTSCR lpszBuffer, int nMasLength );
// Обе функции возвращают число реально скопированных байт текста и 0,
// если параметр nIndex превышает общее число строк в текстовом поле.
// Параметр nIndex задает индекс строки (базируемый на нуле), которую
// необходимо получить. Параметр lpszBuffer указывает за буфер, в
// который будет скопирована строка, причем первое слово хранит
// максимальное число байт, которое можно скопировать в буфер. Вторая
// версия функции помещает в буфер это число самостоятельно на основании
// значения, заданного параметром nMaxLength.
Работа с блоками текста
void Clear( );
// Удаляет выделенный текст, если он существует.
void Copy( );
// Копируем выделенный текст, если он существует, в буфер обмена.
void Cut( );
// Вырезает выделенный текст в текстовом поле и копирует его в
// буфер обмена.
void Paste( );
// Вставляет данные из буфера обмена в текстовое поле в текущую позицию
// курсора.
BOOL Undo( );
// Отменяет последнюю операцию, произведенную в текстовом поле.
BOOL CanUndo( );
// Позволяет определить возможно ли отменить последнюю операцию в
// текстовом поле (в этом случае возвращает истину).
void EmpryUndoBuffer( );
// Производит сброс флага отмены последней операции
Параметры и флаги
BOOL GetModify( );
// Возвращает истину, если содержимое текстового поля изменилось.
void SetModify(BOOL bModified = true);
// Устанавливает флаг изменения для текстового поля
// (истина - устанавливает, ложь - сбрасывает).
BOOL SetReadOnly( BOOL bReadOnly = TRUE );
// Установка поля в режим "только для чтения". Возвращает истину, если
// завершилась удачно. bReadOnly = TRUE - установить режим только для
// чтения, bReadOnly = FALSE - снять режим только для чтения.
void GetRect( LPRECT lpRect );
// Позволяет получить границы форматирования текстового поля, который
// представляют собой прямоугольник, размеры которого не зависят от окна
// текстового поля.
void LimitText( int nChars = 0 );
// Ограничение на максимальное количество вводимых пользователем
// символов.
void SetLimitText( UINT nMax );
// Устанавливает максимальное количество вводимых пользователем
// символов в текстовое поле
Примечание:
здесь представлены большинство наиболее употребительных функций
описанных классов. За более полной информацией обращайтесь в MSDN