Шаг 61.
Среда программирования Visual C++.
Первое "лирическое" отступление: методы класса CEdit

    На этом шаге мы перечислим основные методы класса CEdit.

    На этом шаге мы перечислим основные методы класса CEdit, который используется для создания поля ввода.

Таблица 1. Основные методы класса CEdit
Метод Назначение
CEdit(); Конструирует объект класса CEdit
BOOL CanUndo(); Позволяет определить, может ли быть отменена последняя операция редактирования.
int CharFromPos (CPoint pt); Возвращает отсчитываемый от нуля номер строки и индексы символа, ближайшего к указанной точке данного интерфейсного элемента класса CEdit. Параметр pt - координаты точки в клиентской области данного объекта класса CEdit.Замечание: Эта функция доступна только в Windows 95
void Clear(); Удаляет (очищает) текущее выделение (если таковое имеется) в поле ввода. Удаление, произведенное функцией Clear(), не может быть отменено вызовом функции-члена Undo(). Чтобы удалить текущее выделение и поместить содержимое в буфер обмена, вызывайте функцию-член Cut().
void Copy(); Копирует текущее выделение в поле ввода в буфер обмена в формате CF_TEXT.
BOOL Create (DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID); Объект класса CEdit строится в два этапа. Сначала вызывается конструктор класса CEdit, затем функция Create(), создающая поле ввода Windows и связывающая его с объектом класса CEdit. Во время выполнения функции Create() система Windows посылает в поле ввода сообщения WM_NCCREATE, WM_NCCALCSIZE, WM_CREATE и WM_GETMINMAXINFO.

    По умолчанию они обрабатываются функциями-членами OnNcCreate(), OnNcCalcSize(), OnCreate() и OnGetMinMaxInfo() класса CWnd. С полем ввода используются следующие стили:

  • WS_CHILD - всегда.
  • WS_VISIBLE - обычно.
  • WS_DISABLED - редко.
  • WS_GROUP - для того чтобы объединять интерфейсные элементы в группу.
  • WS_TABSTOP - для того чтобы разрешить перемещение по нажатии клавиши TAB.

    Параметры:

  • dwStyle - задает стиль поля ввода. Допустима любая комбинация стилей редактирования.
  • rect - задает положение и размеры поля ввода. Является объектом класса CRect или структурой CRECT.
  • pParentWnd - задает родительское окно поля ввода (обычно CDialog). He может принимать значение NULL.
  • nID - задает идентификатор (ID) поля ввода.
void Cut(); Используется для удаления (вырезки) текущего выделения (если таковое имеется) и скопирования удаляемого текста в буфер обмена в формате CF_TEXT. Удаление, выполненное функцией Cut(), не может быть отменено вызовом функции-члена Undo(). Чтобы удалить текущее выделение, не помещая удаляемый текст в буфер обмена, используйте функцию-член Clear().
void EmptyUndoBuffer(); Переустанавливает (очищает) флажок отмены поля ввода. После вызова этой функции отмена последнего действия станет недоступной. Флажок отмены устанавливается всякий раз, когда может быть отменена операция в поле ввода. Флажок отмены автоматически очищается при вызове функции-члена SetWindowText() или SetHandle() класса CWnd.
BOOL FmtLines (BOOL bAddEOL); Разрешает или запрещает включение символов "мягкого" разрыва строк в многострочном поле ввода. Мягкий разрыв состоит из двух символов возврата каретки и символа перевода строки, вставленных в конце строки, переносимой по словам. Жесткий разрыв состоит из одного возврата каретки и возврата строки. На строки, оканчивающиеся жестким разрывом, функция FmtLines() не действует. Windows отвечает, только если объект класса CEdit связан с многострочным полем ввода. Функция FmtLines() влияет только на буфер, возвращаемый фуш GetHandle(), и текст, возвращаемый WM_GETTEXT, и не оказывает никакого влияния на отображение текста на экране в поле ввода.

    Параметр bAddEOL указывает, должны ли вставляться символы мягкого разрыва строк. Значение TRUE означает вставлять символы, значение FALSE удаляет их.

int GetFirstVisibleLine() const; Вызывайте эту функцию, чтобы определить самую верхнюю видимую строку в поле ввода.
HLOCAL GetHandle() const; Возвращает дескриптор памяти, зарезервированной в текущий момент для многострочного поля ввода. Дескриптор представляет локальный дескриптор памяти и может использоваться любой функцией памяти Local Windows, принимающей в качестве параvtnhf локальный дескриптор памяти.

    Функция GetHahdle() работает только с многострочными полями ввода.

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

UINT GetLimitText() const; Возвращает значение, соответствующее ограничению на длину для данного объекта класса CEdit. Это ограничение определяет собой максимальный объем текста в байтах, который может принять поле ввода. Замечание: Эта функция доступна только в Windows 95
int GetLine (int nIndex, LPTSTR lpszBuffer) const;
int GetLine (int nIndex, LPTSTR lpszBuffer, int nMaxLength) const;
Получает текстовую строку из поля ввода и помещает ее в буфер, указываемый параметром lpszBuffer. Эта функция не выполняется для однострочного поля ввода. Скопированная строка не содержит завершающего нуль-терминатора.

    Параметры:

  • nIndex - номер строки, подлежащей извлечению из многострочного поля ввода. Номера строк отсчитываются от нуля, значение 0 соответствует первой строке. Этот параметр игнорируется однострочными интерфейсными элементами редактирования.
  • lpszBuffer - указатель на буфер, принимающий копию строки. Первое слово буфера должно задавать максимальное количество байтов, которое может быть скопировано.
  • nMaxLength - максимальное количество байтов, которое может быть скопировано в буфер. Функция GetLine() помещает это значение в первое слово буфера, указываемого параметром lpszBuffer, прежде чем обратиться к Windows.
int GetLineCount() const; Возвращает номер строки в многострочном поле ввода. Функция GetLineCount() работает только для многострочных полей ввода.
int GetMargins() const; Используется для определения левой и правой границ данного поля ввода. Границы измеряются в пикселях. Замечание: Эта функция доступна только в Windows 95
BOOL GetModify() const; Определяет, было ли изменено содержание поля ввода.

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

TCHAR GetPasswordChar() const; Выводит на экран символы пароля когда пользователь вводит текст. Если поле ввода создается со стилем ES_PASWORD, то вводимые символы по умолчанию заменяются при вводе звездочками (*).
void GetRect (LPRECT lpRect) const; Получает прямоугольник форматирования поля ввода, то есть прямоугольник, ограничивающий текст. Он не зависит от размеров поля ввода.

    Прямоугольник форматирования многострочного поля ввода можно изменить с помощью функций-членов SetRect() и SetRectNP().

    Параметр lpRect - указатель на структуру RECT, в которую записываете прямоугольник форматирования.

DWORD GetSel() const;
void GetSel (int& nStartChar, int& nEndChar) const;
Получает начальную и конечную позиции символов текущего выделения (если таковое имеется) в поле ввода, через возвращаемое значение или через параметры. Параметры:
  • nStartChar - ссылка на целое число, получающее значение позиции первого символа текущего выделения.
  • nEndChar - ссылка на целое число, получающее значение позиции первого символа после текущего выделения.
void LimitText (int nChars = 0); Ограничивает длину текста, который пользователь может ввести в поле ввода. LimitText() изменяет только длину текста, который может ввести пользователь, и не оказывает никакого влияния ни на уже введенный текст, ни на длину текста, копируемого в поле ввода с помощы функции-члена SetWindowText() класса CWnd. Если приложение использует функцию SetWindowText(), для того чтобы поместить текст больше, чем установлено при вызове функции LimitText(), пользователь может удалить любой текст в интерфейсном элементе путем непосредственного редактирования. Однако ограничение длины текста предотвратит замещение существующего текста на новый, если только длина текста не была сделана меньше установленного предела при удалении текущего выделения.

    Замечание: В Win32 вместо этой функции используется SetLimitText().

    Параметр nChars задает длину (в байтах) текста, который может ввести пользователь. Если этот параметр принимает значение 0, длина текста устанавливается равной UINT_MAX байтов. Это стандартная реализация

void LineScroll (int nLines, int Chars = 0); Применяется для прокрутки текста в многострочном поле ввода. Эта функция-член работает только для многострочных интерфейсных элементов редактирования.

    Поле ввода не допускает вертикальной прокрутки после вывода последней строки текста. Если сумма номера строки и числа строк прокрутки, заданного параметром nLines, превышает общее число строк в поле ввода, то значение корректируется таким образом, что после прокрутки в верхней части поля ввода оказывается последняя строка.

    Функцию LineScroll можно использовать для горизонтальной прокрутки после вывода последнего символа любой строки. Параметры:

  • nLines - число строк для вертикальной прокрутки.
  • nChars - число символьных позиций для горизонтальной прокрутки. Если поле ввода имеет стиль ES_RIGHT или ES_CENTER, значение этого параметра игнорируется.
void Paste(); используется для вставки данных из буфера обмена в объект класса CEdit, начиная с текущего положения курсора. Данные вставляются только в том случае, если они хранятся в буфере обмена в формате CF_TEXT
CPoint PosFromChar (UINT nChar) const; Определяет положение (от левого верхнего угла) данного символа в данном объекте класса CEdit. Символ задается с помощью отсчитываемого от нуля индекса. Если значение параметра nChar больше, чем индекс последнего символа в данном объекте класса CEdit, то возвращаемое значение задает координаты символьной позиции, следующей непосредственно за последним символом. Замечание: Эта функция доступна только в Windows 95.

    Параметр nChar - отсчитываемый от нуля индекс символа

void ReplaceSel (LPCTSTR lpszNewText, BOOL bCanUndo = FALSE); Заменяет текущее выделение в поле ввода текстом, указанным в параметре lpszNewText. Замещается только участок текста в поле ввода. Если вы хотите заместить весь текст, используйте функцию-член CWnd::SetWindowText(). Если текущего выделения нет, то новый текст вставляется в текущее положение курсора.

    Параметры:

  • lpszNewText - указатель на завершающуюся нуль-терминатором строку, содержащую замещающий текст.
  • bCanUndo - чтобы действие этой функции могло быть отменено, установите значение этого параметра в TRUE. Значение по умолчанию - FALSE.
void SetHandle (HLOCAL hBuffer); Устанавливает дескриптор локальной памяти, используемый многострочным полем ввода. Интерфейсный элемент будет использовать этот буфер для хранения выводимого в данный момент на экран текста, вместо того чтобы выделять свой собственный. Эта функция-член выполняется только для многострочного поля ввода. Прежде чем интерфейсный элемент установит новый дескриптор памяти, необходимо получить дескриптор текущего буфера памяти с помощью функции-члена GetHahdle() и освободить эту память, используя функцию Windows Local Free.

    Функция SetHandle() очищает буфер отмены (следовательно, функция-член CanUndo() возвращает значение 0) и флаг внутренней модификации (следовательно, функция-член GetModify() возвращает значение 0). Окно поля ввода перерисовывается. Вы можете использовать эту функцию-член в многострочном поле ввода в окне диалога, если только последнее создано с установленным флагом стиля DS_LOCALEDIT.

    Параметр hBuffer - дескриптор локальной памяти. Он должен быть предварительно создан вызовом функции Windows LocalAlloc, с описанием флага LMEM_MOVABLE. Предполагается, что в памяти содержится завершающаяся нуль-терминатором строка. Если это не так, первый байт выделяемой памяти должен быть обнулен.

void LimitText (UINT nMax); Устанавливает предельный размер текста для данного объекта класса CEdit, то есть максимальный объем текста (в байтах), который может принять поле ввода.

    Изменение предельного размера текста ограничивает только текст вводимый пользователем. Оно не оказывает влияния ни на уже существующий текст, ни на длину текста, копируемого в поле ввода с помощью функции-члена SetWindowText() класса CWnd. Если приложение использует функцию SetWindowText(), чтобы поместить в поле ввода текста больше, чем это установлено при вызове функции SetLimitText(), пользователь может удалить любой текст в интерфейсном элементе путем непосредственного редактирования. Однако ограничение длины текста предотвратит замещение существующего текста на новый, если только длина текста не была сделана меньше установленного предела при удалении текущего выделения. Эта функция заменяет LimitText() в Win32. Параметр nМах - новый предельный размер текста (в байтах).

void SetMargins (UINT nLeft, UINT nRight); Устанавливает размеры левого и правого полей данного поля ввода. Замечание: Эта функция доступна только в Windows 95.

    Параметры:

  • nLeft - новая ширина левого поля (в пикселях).
  • nRight - новая ширина правого поля (в пикселях).
void SetModify (BOOL bModified = TRUE); Устанавливает или снимает флаг модификации в поле ввода, показывающий, был ли изменен текст в интерфейсном элементе. Флаг модификации автоматически устанавливается всякий раз при изменении текста. Его значение можно определить с помощью функции-члена GetModify().

    Параметр bModified - значение TRUE означает, что текст был изменен, а FALSE - что текст не менялся. По умолчанию флаг модификации установлен.

void SetPasswordChar (TCHAR ch); Устанавливает или отменяет вывод на экран символов пароля при наборе пользователем текста. Когда вывод установлен, на экране отображается символ, который набирает пользователь. Эта функция-член не оказывает влияния на многострочное поле ввода. Когда вызывается функция-член SetPasswordChar(), объект класса CEdit перерисовывает все видимые символы, используя символ, заданный в параметре ch.

    Если поле ввода создается со стилем ES_PASSWORD, по умолчанию символом для замещения вводимого текста является звездочка (*). Этот стиль отменяется, если функция SetPasswordChar() вызывается с параметром ch, установленным в 0.

    Параметр ch задает символ, заменяющий текст, вводимый пользователем. Если параметр установлен в 0, текст не заменяется.

BOOL SetReadOnly (BOOL bReadOnly = TRUE); Ограничивает доступ к полю ввода правами на чтение. Текущую установку можно определить, проверив флаг ES_READONLY, значение которого возвращается функцией CWnd::GetStyle().

    Параметр bReadOnly задает, установлен или отменен доступ к полю ввода с правом только на чтение. Значение TRUE означает, что установлено состояние "только чтение", а значение FALSE - "чтение/запись".

void SetRect (LPCRECT lpRect); Устанавливает размеры прямоугольника, заданного указанными координатами. Эта функция-член выполняется только для многострочных полей ввода.

    Функция SetRect() используется для установки прямоугольника форматирования для многострочного поля ввода. Прямоугольник форматирования ограничивает текст, причем его размеры не зависят oт размеров самого интерфейсного элемента. Когда поле ввода создается впервые, размеры прямоугольника форматирования совпадают с размерами пользовательской области окна поля ввода. С помощьк функции-члена SetRect() приложение может сделать прямоугольник форматирования больше или меньше поля ввода. В поле ввода без полосы прокрутки текст выводится без разрыва, если прямоугольник форматирования больше, чем текст. Если поле ввода имеет границу, прямоугольник форматирования ограничен ее размерами. Если вы используете значение, возвращенное функцией GetRect(), то прежде чем передать его функции SetRect(), необходимо удалить размеры границы. Когда вызывается функция SetRect(), текст поля ввода переформатируется и заново отображается на экране.

    Параметр lpRect указывает на структуру RECT или объект класса CRect, определяющий новые размеры прямоугольника форматирования.

SetRectNP (LPCRECT lpRect); Исользуется для установки прямоугольника форматирования многострочного поля ввода, то есть прямоугольника, ограничивающего текст. Он не зависит от размеров интерфейсного элемента. Действие функции SetRectNP() аналогично действию функции SetRect() за исключением того, что поле ввода не перерисовывается. Когда поле ввода создается впервые, размеры прямоугольника форматирования совпадают с размерами пользовательской области окна поля ввода. Вызывая функцию-член SetRectNP(), приложение может сделать прямоугольник форматирования больше или меньше поля ввода.

    В поле ввода без полосы прокрутки текст выводится без разрыва, если прямоугольник форматирования больше, чем интерфейсный элемент. Эта функция-член работает только для многострочных полей ввода.

    Параметр lpRect указывает на структуру RECT или на объект класса CRect, определяющий новые размеры прямоугольника.

void SetSel (DWORD dwSelection, BOOL bNoScroll = FALSE);
void SetSel (int nStartChar, int nEndChar, BOOL bNpScroll = False);
Выделяет диапазон символов в поле ввода. Параметры:
  • dwSelection - в младшем слове указывается начальная позиция, а в старшем - и конечная. Если младшее слово установлено в 0, а старшее в 1, то выделяется весь текст поля ввода. Если младшее слово установлено в 1, любое текущее выделение удаляется.
  • bNoScroll - если установлено в FALSE, поле прокручивается, если в TRUE - нет.
  • nStartChar - начальная позиция. Если параметр nStartChar установлен в 0, a nEndChar - в 1, выделяется весь текст поля ввода. Если параметр nStartChar установлен в 1, текущее выделение удаляется.
  • nEndChar - конечная позиция.
void SetTabStops();
BOOL SetTabStops (const int& cxEachStop);
BOOL SetTabStops (int nTabStops, LPRINT rgTabStops);
Устанавливает позиции табуляции в многострочном поле ввода. При копировании текста в такой интерфейсный элемент символы табуляции вызывают появление пробела длиной до следующей позиции табуляции.

    Чтобы установить позиции табуляции в размер по умолчанию (32 диалоговых единицы), вызывайте прототип SetTabStops() без параметров. Чтобы установить другие позиции табуляции, вызывайте прототип с параметром cxEachStop. Чтобы установить позиции табуляции как массив расстояний, используйте прототип с двумя параметрами. Эта функция-член работает только для многострочных полей ввода, Функция SetTabStops() не перерисовывает автоматически интерфейсный элемент. Если вы устанавливаете позиции табуляции для текста, уже находящегося в поле ввода, вызовите функцию CWnd::InvalidateRect().

    Параметры:

  • cxEachStop - задает интервал позиций табуляции, равный cxEachStop.
  • nTabStop - задает число позиций табуляции, хранящихся в массиве указываемом параметром rgTabStops.
  • rgTabStops - указатель на массив значений беззнаковых целых задающих позиции табуляции в диалоговых единицах. Диалоговая единица представляет собой горизонтальное или вертикальное расстояние. Одна горизонтальная диалоговая единица равна четверти текущей базовой диалоговой единицы ширины, а одна вертикальная диалоговая единица равна одной восьмой текущей базовой диалоговой единицы высоты. Базовые диалоговые единицы рассчитываются на основании высоты и ширины текущего системного шрифта. Функция GetDialogBaseUnits() возвращает значение текущих базовых единиц в пикселях.
BOOL Undo(); Отменяет последнюю операцию в поле ввода.

    Операция отмены, в свою очередь, тоже может быть отменена. На пример, вы можете восстановить удаленный текст первым вызовол функции Undo(). До тех пор пока не было выполнено операций редактирования, вы можете снова удалить текст вторым вызовом функции Undo().

    Со следующего шага мы начнем рассмотривать создание многопоточных приложений.




Предыдущий шаг Содержание Следующий шаг