CEdit 类

提供 Windows 编辑控件功能。

语法

class CEdit : public CWnd

成员

公共构造函数

名称 描述
CEdit::CEdit 构造 CEdit 控件对象。

公共方法

名称 描述
CEdit::CanUndo 确定是否可撤消编辑控件操作。
CEdit::CharFromPos 检索离指定位置最近的字符的行和字符索引。
CEdit::Clear 删除(清除)编辑控件中的当前所选内容(如果有)。
CEdit::Copy 以 CF_TEXT 格式将编辑控件中的当前所选内容(如果有)复制到剪贴板。
CEdit::Create 创建 Windows 编辑控件并将其附加到 CEdit 对象。
CEdit::Cut 删除(剪切)编辑控件中的当前所选内容(如果有),并以 CF_TEXT 格式将已删除的文本复制到剪贴板。
CEdit::EmptyUndoBuffer 重置(清除)编辑控件的撤消标志。
CEdit::FmtLines 设置是否在多行编辑控件中包含软换行符。
CEdit::GetCueBanner 检索当控件为空且没有焦点时,在编辑控件中显示为文本提示或提示的文本。
CEdit::GetFirstVisibleLine 确定编辑控件中最顶部可见的行。
CEdit::GetHandle 检索当前为多行编辑控件分配的内存的句柄。
CEdit::GetHighlight 获取当前编辑控件中突出显示的文本范围内的起始字符和结束字符的索引。
CEdit::GetLimitText 获取此 CEdit 可包含的最大文本量。
CEdit::GetLine 从编辑控件检索文本行。
CEdit::GetLineCount 检索多行编辑控件中的行数。
CEdit::GetMargins 获取此 CEdit 的左边距和右边距。
CEdit::GetModify 确定是否修改了编辑控件的内容。
CEdit::GetPasswordChar 检索用户输入文本时在编辑控件中显示的密码字符。
CEdit::GetRect 获取编辑控件的格式化矩形。
CEdit::GetSel 获取编辑控件中当前选定内容的第一个和最后一个字符位置。
CEdit::HideBalloonTip 隐藏与当前编辑控件关联的任何气球状提示。
CEdit::LimitText 限制用户可在编辑控件中输入的文本长度。
CEdit::LineFromChar 检索包含指定字符索引的行的行号。
CEdit::LineIndex 检索多行编辑控件中的行的字符索引。
CEdit::LineLength 检索编辑控件中行的长度。
CEdit::LineScroll 滚动多行编辑控件的文本。
CEdit::Paste 将数据从剪贴板插入到编辑控件中的当前光标位置。 仅当剪贴板包含 CF_TEXT 格式的数据时,才会插入数据。
CEdit::PosFromChar 检索指定字符索引左上角的坐标。
CEdit::ReplaceSel 将编辑控件中的当前选定内容替换为指定的文本。
CEdit::SetCueBanner 设置当控件为空且没有焦点时,在编辑控件中显示为文本提示或提示的文本。
CEdit::SetHandle 将句柄设置为多行编辑控件将使用的本地内存。
CEdit::SetHighlight 突出显示当前编辑控件中显示的文本范围。
CEdit::SetLimitText 设置此 CEdit 可包含的最大文本量。
CEdit::SetMargins 设置此 CEdit 的左边距和右边距。
CEdit::SetModify 设置或清除编辑控件的修改标志。
CEdit::SetPasswordChar 设置或移除用户输入文本时在编辑控件中显示的密码字符。
CEdit::SetReadOnly 设置编辑控件的只读状态。
CEdit::SetRect 设置多行编辑控件的格式化矩形并更新该控件。
CEdit::SetRectNP 设置多行编辑控件的格式化矩形,但不重新绘制控件窗口。
CEdit::SetSel 在编辑控件中选择一个字符范围。
CEdit::SetTabStops 设置多行编辑控件中的制表位。
CEdit::ShowBalloonTip 显示与当前编辑控件关联的气球状提示。
CEdit::Undo 反转上次编辑控制操作。

注解

编辑控件是一个矩形子窗口,用户可在其中输入文本。

可通过对话框模板创建编辑控件,也可在代码中直接创建。 在这两种情况下,首先调用构造函数 CEdit 来构造 CEdit 对象,然后调用 Create 成员函数来创建 Windows 编辑控件,并将其附加到 CEdit 对象。

构造可以是派生自 CEdit 的类中的单步过程。 为派生类编写构造函数并从构造函数中调用 Create

CEditCWnd 集成重要功能。 若要设置和检索 CEdit 对象中的文本,请使用 CWnd 成员函数 SetWindowTextGetWindowText;即使是多行控件,这些函数也会设置或获取编辑控件的全部内容。 多行控件中的文本行由“\r\n”字符序列分隔。 此外,如果编辑控件是多行的,则通过调用 CEdit 成员函数 GetLineSetSelGetSel, 和 ReplaceSel 来获取和设置控件的一部分文本。

如果想要处理编辑控件发送到其父级(通常是从 CDialog 派生的类)的 Windows 通知消息,请将消息映射条目和消息处理程序成员函数添加到每个消息的父类。

每个消息映射条目采用以下格式:

ON_NOTIFICATION(id,memberFxn)

其中,id 指定发送通知的编辑控件的子窗口 ID,memberFxn 是为处理通知而编写的父成员函数的名称。

父函数原型如下:

afx_msg void memberFxn ( );

以下是潜在消息映射条目的列表,并描述了在何种情况下将这些条目发送到父级:

  • 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 对象,则在用户关闭对话框时自动销毁 CEdit 对象。

如果使用对话框编辑器基于对话框资源创建 CEdit 对象,则在用户关闭对话框时自动销毁 CEdit 对象。

如果在窗口中创建 CEdit 对象,可能还需要销毁该对象。 如果在堆栈上创建 CEdit 对象,则会自动销毁该对象。 如果使用 new 函数在堆上创建 CEdit 对象,则必须在该对象上调用 delete,以便在用户终止 Windows 编辑控件时将其销毁。 如果在 CEdit 对象中分配任何内存,请替代 CEdit 析构函数以释放分配。

若要修改编辑控件中的某些样式(例如 ES_READONLY),必须将特定消息发送到控件,而不是使用 ModifyStyle。 请参阅 Windows SDK 中的编辑控件样式

有关 CEdit 的详细信息,请参阅控件

继承层次结构

CObject

CCmdTarget

CWnd

CEdit

要求

标头:afxwin.h

CEdit::CanUndo

调用此函数以确定是否可撤消上次编辑操作。

BOOL CanUndo() const;

返回值

如果上次编辑操作可通过调用 Undo 成员函数进行撤消,则为非零值;如果无法撤消,则为 0。

备注

有关详细信息,请参阅 Windows SDK 中的 EM_CANUNDO

示例

请参阅 CEdit::Undo 的示例。

CEdit::CEdit

构造 CEdit 对象。

CEdit();

备注

使用 Create 构造 Windows 编辑控件。

示例

// Declare a local CEdit object.
CEdit myEdit;

// Declare a dynamic CEdit object.
CEdit *pmyEdit = new CEdit;

CEdit::CharFromPos

调用此函数,检索此 CEdit 控件中最接近指定点的字符的从零开始的行和字符索引

int CharFromPos(CPoint pt) const;

参数

pt
CEdit 对象的工作区中某个点的坐标。

返回值

低位字中的字符索引和低位字中的行索引。

注解

注意

此成员函数从 Windows 95 和 Windows NT 4.0 开始可用。

有关详细信息,请参阅 Windows SDK 中的 EM_CHARFROMPOS

示例

// CMyEdit inherits from CEdit
void CMyEdit::OnLButtonDown(UINT nFlags, CPoint point)
{
   int n = CharFromPos(point);
   int nLineIndex = HIWORD(n);
   int nCharIndex = LOWORD(n);
   TRACE(_T("nLineIndex = %d, nCharIndex = %d\r\n"), nLineIndex, nCharIndex);

   CEdit::OnLButtonDown(nFlags, point);
}

CEdit::Clear

调用此函数以删除(清除)编辑控件中的当前所选内容(如有)。

void Clear();

备注

可通过调用 Undo 成员函数撤消 Clear 执行的删除。

若要删除当前所选内容并将已删除的内容放入剪贴板,请调用 Cut 成员函数。

有关详细信息,请参阅 Windows SDK 中的 WM_CLEAR

示例

// Delete all of the text.
m_myEdit.SetSel(0, -1);
m_myEdit.Clear();

CEdit::Copy

调用此函数可以 CF_TEXT 格式将编辑控件中的当前所选内容(如果有)复制到剪贴板。

void Copy();

备注

有关详细信息,请参阅 Windows SDK 中的 WM_COPY

示例

// Copy all of the text to the clipboard.
m_myEdit.SetSel(0, -1);
m_myEdit.Copy();

CEdit::Create

创建 Windows 编辑控件并将其附加到 CEdit 对象。

virtual BOOL Create(
    DWORD dwStyle,
    const RECT& rect,
    CWnd* pParentWnd,
    UINT nID);

参数

dwStyle
指定编辑控件的样式。 将编辑样式的任意组合应用于控件。

rect
指定编辑控件的大小和位置。 可以是 CRect 对象或 RECT 结构。

pParentWnd
指定编辑控件的父窗口(通常为 CDialog)。 不得为 NULL。

nID
指定编辑控件的 ID。

返回值

如果初始化成功,则为非零值;否则为 0。

备注

请分两步构造 CEdit 对象。 首先调用 CEdit 构造函数,然后调用 Create,这会创建 Windows 编辑控件并将其附加到 CEdit 对象。

执行 Create 时,Windows 会将 WM_NCCREATEWM_NCCALCSIZEWM_CREATEWM_GETMINMAXINFO 消息发送到编辑控件。

默认情况下,这些消息由 CWnd 基类中的 OnNcCreateOnNcCalcSizeOnCreateOnGetMinMaxInfo 成员函数处理。 若要扩展默认消息处理,请从 CEdit 派生一个类,将消息映射添加到新类,并替代上述消息处理程序成员函数。 例如,替代 OnCreate 来为新类执行所需的初始化。

将以下窗口样式应用于编辑控件。

  • WS_CHILD(始终使用)

  • WS_VISIBLE(经常使用)

  • 很少 WS_DISABLED

  • WS_GROUP(将控件分组)

  • WS_TABSTOP(在 Tab 键顺序中包含编辑控件)

示例

// dynamically create an edit control
CEdit *pEdit = new CEdit;
pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
              CRect(10, 10, 100, 100), this, 1);

CEdit::Cut

调用此函数以删除(剪切)编辑控件中的当前所选内容(如果有),并以 CF_TEXT 格式将已删除的文本复制到剪贴板。

void Cut();

注解

可通过调用 Undo 成员函数撤消 Cut 执行的删除。

若要删除当前选定内容而不将已删除的文本放入剪贴板,请调用 Clear 成员函数。

有关详细信息,请参阅 Windows SDK 中的 WM_CUT

示例

// Delete all of the text and copy it to the clipboard.
m_myEdit.SetSel(0, -1);
m_myEdit.Cut();

CEdit::EmptyUndoBuffer

调用此函数以重置(清除)编辑控件的撤消标志。

void EmptyUndoBuffer();

备注

编辑控件现在无法撤消最后一个操作。 每当可撤消编辑控件中的操作时,都会设置撤消标志。

每当调用 SetWindowTextSetHandleCWnd 成员函数时,都会自动清除撤消标志。

有关详细信息,请参阅 Windows SDK 中的 EM_EMPTYUNDOBUFFER

示例

// Clear the undo buffer.
if (m_myEdit.CanUndo())
{
   m_myEdit.EmptyUndoBuffer();
   ASSERT(!m_myEdit.CanUndo());
}

CEdit::FmtLines

调用此函数以设置是否在多行编辑控件中包含软换行符。

BOOL FmtLines(BOOL bAddEOL);

参数

bAddEOL
指定是否插入软换行符。 值为 TRUE 表示插入字符;值为 FALSE 表示删除这些字符。

返回值

如果发生任何格式设置,则为非零值;否则为 0。

备注

一个软换行符由两个回车符和一个换行符组成,其插入到因换行而导致中断的行尾。 一个硬换行符由一个回车符和一个换行符组成。 以硬换行符结尾的行不受 FmtLines 影响。

仅当 CEdit 对象是多行编辑控件时,Windows 才会做出响应。

FmtLines 仅影响 GetHandle 返回的缓冲区和 WM_GETTEXT 返回的文本。 它不会影响文本在编辑控件中的显示。

有关详细信息,请参阅 Windows SDK 中的 EM_FMTLINES

示例

CString strText;

// Add soft line-break breaks.
m_myEdit.FmtLines(TRUE);

// Dump the text of the edit control.
m_myEdit.GetWindowText(strText);
AFXDUMP(strText);

// Remove soft line-break breaks.
m_myEdit.FmtLines(FALSE);

CEdit::GetCueBanner

检索当控件为空时,在编辑控件中显示为文本提示或提示的文本。

BOOL GetCueBanner(
    LPWSTR lpszText,
    int cchText) const;

CString GetCueBanner() const;

参数

lpszText
[out] 指向包含提示文本的字符串的指针。

cchText
[in] 可接收的字符数。 此数字包括终止 NULL 字符。

返回值

对于第一个重载,如果方法成功,则为 TRUE;否则为 FALSE。

对于第二个重载,如果方法成功,则为包含提示文本的 CString;否则为空字符串 ("")。

注解

此方法将发送 EM_GETCUEBANNER 消息,如 Windows SDK 中所述。 有关详细信息,请参阅 Edit_GetCueBannerText 宏。

CEdit::GetFirstVisibleLine

调用此函数以确定编辑控件中最顶部可见的行。

int GetFirstVisibleLine() const;

返回值

最顶部可见行的从零开始的索引。 对于单行编辑控件,返回值为 0。

注解

有关详细信息,请参阅 Windows SDK 中的 EM_GETFIRSTVISIBLELINE

示例

int nFirstVisible = m_myEdit.GetFirstVisibleLine();

// Scroll the edit control so that the first visible line
// is the first line of text.
if (nFirstVisible > 0)
{
   m_myEdit.LineScroll(-nFirstVisible, 0);
}

CEdit::GetHandle

调用此函数以检索当前为多行编辑控件分配的内存的句柄。

HLOCAL GetHandle() const;

返回值

一个本地内存句柄,用于标识包含编辑控件内容的缓冲区。 如果发生错误,例如将消息发送到单行编辑控件,则返回值为 0。

备注

句柄是本地内存句柄,可供采用本地内存句柄作为参数的任何本地 Windows 内存函数使用。

GetHandle 仅由多行编辑控件处理。

仅当在设置了 DS_LOCALEDIT 样式标志的情况下创建对话框时,才在对话框中为多行编辑控件调用 GetHandle。 如果未设置 DS_LOCALEDIT 样式,仍会收到非零返回值,但无法使用返回的值。

注意

GetHandle 不适用于 Windows 95/98。 如果在 Windows 95/98 中调用 GetHandle,它将返回 NULL。 GetHandle 将按 Windows NT 3.51 及更高版本中所述工作。

有关详细信息,请参阅 Windows SDK 中的 EM_GETHANDLE

示例

HLOCAL h = m_myEdit.GetHandle();
LPCTSTR lpszText = (LPCTSTR)::LocalLock(h);

// Dump the text of the edit control.
AFXDUMP(lpszText);

::LocalUnlock(h);

CEdit::GetHighlight

获取当前编辑控件中突出显示的文本范围内的第一个和最后一个字符的索引。

BOOL GetHighlight(
    int* pichStart,
    int* pichEnd) const;

参数

pichStart
[out] 突出显示的文本范围中第一个字符的从零开始的索引。

pichEnd
[out] 突出显示的文本范围中最后一个字符的从零开始的索引。

返回值

如果此方法成功,则返回 TRUE;否则返回 FALSE。

注解

此方法将发送 EM_GETHILITE 消息,如 Windows SDK 中所述。 SetHighlightGetHighlight 当前都仅对 UNICODE 版本启用。

CEdit::GetLimitText

调用此成员函数以获取此 CEdit 对象的文本限制。

UINT GetLimitText() const;

返回值

CEdit 对象的当前文本限制(以 TCHAR 为单位)。

备注

文本限制是编辑控件可接受的最大文本量(以 TCHAR 为单位)。

注意

此成员函数从 Windows 95 和 Windows NT 4.0 开始可用。

有关详细信息,请参阅 Windows SDK 中的 EM_GETLIMITTEXT

示例

CString strText(_T("I'm an edit control!"));
UINT nLength = strText.GetLength() * sizeof(TCHAR);

// Want the text limit to be at least the size of the new string.
if (m_myEdit.GetLimitText() < nLength)
   m_myEdit.SetLimitText(nLength);

m_myEdit.SetWindowText(strText);

CEdit::GetLine

调用此函数可从编辑控件中检索文本行,并将其置于 lpszBuffer 中。

int GetLine(
    int nIndex,
    LPTSTR lpszBuffer) const;

int GetLine(
    int nIndex,
    LPTSTR lpszBuffer,
    int nMaxLength) const;

参数

nIndex
指定要从多行编辑控件中检索的行号。 行号从零开始;值 0 指定第一行。 单行编辑控件会忽略此参数。

lpszBuffer
指向接收行副本的缓冲区。 缓冲区的第一个字必须指定可复制到缓冲区的最大 TCHAR 数。

nMaxLength
指定可复制到缓冲区的最大 TCHAR 字符数。 GetLine 在调用 Windows 之前,将此值放在 lpszBuffer 的第一个字中。

返回值

实际复制的字符数。 如果 nIndex 指定的行号大于编辑控件中的行数,则返回值为 0。

备注

复制的行不包含 null 终止字符。

有关详细信息,请参阅 Windows SDK 中的 EM_GETLINE

示例

请参阅 CEdit::GetLineCount 的示例。

CEdit::GetLineCount

调用此函数以检索多行编辑控件中的行数。

int GetLineCount() const;

返回值

一个包含多行编辑控件中的行数的整数。 如果未在编辑控件中输入任何文本,则返回值为 1。

注解

GetLineCount 仅由多行编辑控件处理。

有关详细信息,请参阅 Windows SDK 中的 EM_GETLINECOUNT

示例

int i, nLineCount = m_myEdit.GetLineCount();
CString strText, strLine;
// Dump every line of text of the edit control.
for (i = 0; i < nLineCount; i++)
{
   // length of line i:
   int len = m_myEdit.LineLength(m_myEdit.LineIndex(i));
   m_myEdit.GetLine(i, strText.GetBuffer(len), len);
   strText.ReleaseBuffer(len);
   strLine.Format(_T("line %d: '%s'\n"), i, strText);
   AFXDUMP(strLine);
}

CEdit::GetMargins

调用此成员函数以检索此编辑控件的左右边距。

DWORD GetMargins() const;

返回值

左边距的宽度(以低位字为单位)和右边距的宽度(以高位字为单位)。

备注

边距以像素为单位。

注意

此成员函数从 Windows 95 和 Windows NT 4.0 开始可用。

有关详细信息,请参阅 Windows SDK 中的 EM_GETMARGINS

示例

请参阅 CEditView::GetEditCtrl 的示例。

CEdit::GetModify

调用此函数以确定是否已修改编辑控件的内容。

BOOL GetModify() const;

返回值

如果编辑控件内容已修改,则为非零值;如果它们没有改变,则为 0。

备注

Windows 会维护一个内部标志,指示编辑控件的内容是否已更改。 首次创建编辑控件时会清除此标志,也可通过调用 SetModify 成员函数来清除它。

有关详细信息,请参阅 Windows SDK 中的 EM_GETMODIFY

示例

// Reset the modified state only if my edit has been modified.
if (m_myEdit.GetModify())
   m_myEdit.SetModify(FALSE);

CEdit::GetPasswordChar

调用此函数以检索当用户输入文本时编辑控件中显示的密码字符。

TCHAR GetPasswordChar() const;

返回值

指定要显示的字符,而不是用户键入的字符。 如果不存在密码字符,则返回值为 NULL。

备注

如果使用 ES_PASSWORD 样式创建编辑控件,则由支持该控件的 DLL 确定默认密码字符。 清单或 InitCommonControlsEx 方法确定哪个 DLL 支持编辑控件。 如果 user32.dll 支持编辑控件,则默认密码字符为 ASTERISK ('*', U+002A)。 如果 comctl32.dll 版本 6 支持编辑控件,则默认字符为 BLACK CIRCLE ('●', U+25CF)。 若要详细了解哪些 DLL 和版本支持通用控件,请参阅 Shell 和公共控件版本

此方法将发送 EM_GETPASSWORDCHAR 消息,如 Windows SDK 中所述。

示例

// Turn on the password mode.
m_myEdit.SetPasswordChar('*');
ASSERT(m_myEdit.GetStyle() & ES_PASSWORD);
ASSERT(m_myEdit.GetPasswordChar() == '*');

CEdit::GetRect

调用此函数以获取编辑控件的格式化矩形。

void GetRect(LPRECT lpRect) const;

参数

lpRect
指向接收格式化矩形的 RECT 结构。

备注

格式化矩形是文本的限制矩形,与编辑控件窗口的大小无关。

SetRectSetRectNP 成员函数可修改多行编辑控件的格式化矩形。

有关详细信息,请参阅 Windows SDK 中的 EM_GETRECT

示例

请参阅 CEdit::LimitText 的示例。

CEdit::GetSel

调用此函数,使用返回值或参数获取编辑控件中当前所选内容(如有)的起始和结束字符位置。

DWORD GetSel() const;

void GetSel(
    int& nStartChar,
    int& nEndChar) const;

参数

nStartChar
对将接收当前选定内容中第一个字符位置的整数的引用。

nEndChar
对将接收当前选定内容结束后第一个未选定字符位置的整数的引用。

返回值

返回 DWORD 的版本会返回一个值,该值包含低位字中的起始位置,以及在高位字中所选内容结束后第一个未选定字符的位置。

备注

有关详细信息,请参阅 Windows SDK 中的 EM_GETSEL

示例

// Set the selection to be all characters after the current selection.
DWORD dwSel = m_myEdit.GetSel();
m_myEdit.SetSel(HIWORD(dwSel), -1);

CEdit::HideBalloonTip

隐藏与当前编辑控件关联的任何气球状提示。

BOOL HideBalloonTip();

返回值

如果此方法成功,则返回 TRUE;否则返回 FALSE。

注解

此函数将发送 EM_HIDEBALLOONTIP 消息,如 Windows SDK 中所述。

CEdit::LimitText

调用此函数以限制用户可在编辑控件中输入的文本长度。

void LimitText(int nChars = 0);

参数

nChars
指定用户可输入的文本长度(以 TCHAR 为单位)。 如果此参数为 0,则文本长度设置为 UINT_MAX 字节。 此选项为默认行为。

注解

更改文本限制仅会限制用户可输入的文本。 它不会影响编辑控件中已有的任何文本,也不会影响 CWnd 中的 SetWindowText 成员函数复制到编辑控件的文本长度。 如果应用程序使用 SetWindowText 函数将更多文本放置在编辑控件中,而不是在对 LimitText 的调用中指定,则用户可以删除编辑控件中的任何文本。 但是,除非删除当前选定内容会导致文本低于文本限制,否则文本限制将阻止用户使用新文本替换现有文本。

注意

在 Win32 中(Windows NT 和 Windows 95/98),SetLimitText 将替换此函数。

有关详细信息,请参阅 Windows SDK 中的 EM_LIMITTEXT

示例

// Limit the number of characters to be the maximum number visible.

// Get the text metrics for the edit; needed for the
// average character width.
TEXTMETRIC tm;
CDC *pDC = m_myEdit.GetDC();
pDC->GetTextMetrics(&tm);
m_myEdit.ReleaseDC(pDC);

CRect r;
m_myEdit.GetRect(&r);
m_myEdit.LimitText(r.Width() / tm.tmAveCharWidth);

CEdit::LineFromChar

调用此函数以检索包含指定字符索引的行的行号。

int LineFromChar(int nIndex = -1) const;

参数

nIndex
包含编辑控件文本中所需字符的从零开始的索引值,或者包含 -1。 如果 nIndex 为 -1,则指定当前行,即包含脱字号的行。

返回值

包含 nIndex 指定的字符索引的行的从零开始的行号。 如果 nIndex 为 -1,则返回包含所选内容第一个字符的行数。 如果未选定任何内容,则返回当前行号。

备注

字符索引是从编辑控件开头算起的字符数。

此成员函数仅供多行编辑控件使用。

有关详细信息,请参阅 Windows SDK 中的 EM_LINEFROMCHAR

示例

// The index of the char to get information on.
int nIndex = 4;
CString strText;

m_myEdit.GetWindowText(strText);
strText = strText.Mid(nIndex, 1);

// Get the text extent of the character.
CDC *pDC = m_myEdit.GetDC();
CSize sz = pDC->GetTextExtent(strText);
m_myEdit.ReleaseDC(pDC);

CPoint pt = m_myEdit.PosFromChar(nIndex);

// Dump the index, character, line number, and character bounds.
TRACE(_T("nIndex = %d, character = %c, line = %d, bounds = ")
      _T("{%d, %d, %d, %d}\r\n"),
      nIndex, strText[0], m_myEdit.LineFromChar(nIndex),
      pt.x /* left */, pt.y /* top */,
      pt.x + sz.cx /* right */, pt.y + sz.cy /* bottom */);

CEdit::LineIndex

调用此函数以检索多行编辑控件中某行的字符索引。

int LineIndex(int nLine = -1) const;

参数

nLine
包含编辑控件文本中所需行的索引值,或者包含 -1。 如果 nLine 为 -1,则指定当前行,即包含脱字号的行。

返回值

返回 nLine 中指定的行的字符索引;如果指定的行数大于编辑控件中的行数,则返回 -1。

备注

字符索引是从编辑控件开头到指定的行的字符数。

此成员函数仅由多行编辑控件处理。

有关详细信息,请参阅 Windows SDK 中的 EM_LINEINDEX

示例

// The string for replacing.
CString strString(_T("Hi, we're the replacements."));
int nBegin, nEnd;

// Replace the second line, if it exists, of the edit control
// with the text strString.
if ((nBegin = m_myEdit.LineIndex(1)) != -1)
{
   nEnd = nBegin + m_myEdit.LineLength(nBegin);
   m_myEdit.SetSel(nBegin, nEnd);
   m_myEdit.ReplaceSel(strString);
}

CEdit::LineLength

检索编辑控件中行的长度。

int LineLength(int nLine = -1) const;

参数

nLine
要检索其长度的行中的字符的从零开始的索引。 默认值为 -1。

返回值

对于单行编辑控件,返回值是编辑控件中文本的长度(以 TCHAR 为单位)。

对于多行编辑控件,返回值是 nLine 指定的行的长度(以 TCHAR 为单位)。 对于 ANSI 文本,长度是行中的字节数;对于 Unicode 文本,长度是行中的字符数。 长度不包括行末尾的回车符。

如果 nLine 参数大于控件中的字符数,则返回值为零。

如果 nLine 参数为 -1,则返回值是包含选定字符的行中的未选中字符数。 例如,如果所选内容从一行的第 4 个字符扩展到下一行末尾的第 8 个字符,则返回值为 10。 也就是说,第一行有 3 个字符,下一行有 7 个字符。

有关 TCHAR 类型的详细信息,请参阅 Windows 数据类型中的表中的 TCHAR 行。

注解

此方法由 EM_LINELENGTH 消息提供支持,如 Windows SDK 中所述。

示例

请参阅 CEdit::LineIndex 的示例。

CEdit::LineScroll

调用此函数以滚动多行编辑控件的文本。

void LineScroll(
    int nLines,
    int nChars = 0);

参数

nLines
指定要垂直滚动的行数。

nChars
指定要水平滚动的字符位置数。 如果编辑控件具有 ES_RIGHT 或 ES_CENTER 样式,则忽略此值。

备注

此成员函数仅由多行编辑控件处理。

编辑控件不会垂直滚动超出编辑控件中的最后一行文本。 如果当前行加上 nLines 指定的行数超过编辑控件中的行总数,则会调整该值,以便编辑控件的最后一行滚动到编辑控件窗口的顶部。

可使用 LineScroll 水平滚动超过任何行的最后一个字符。

有关详细信息,请参阅 Windows SDK 中的 EM_LINESCROLL

示例

请参阅 CEdit::GetFirstVisibleLine 的示例。

CEdit::Paste

调用此函数,将剪贴板中的数据插入插入点处的 CEdit

void Paste();

备注

仅当剪贴板包含 CF_TEXT 格式的数据时,才会插入数据。

有关详细信息,请参阅 Windows SDK 中的 WM_PASTE

示例

// Replace all of the text with the text in the clipboard.
m_myEdit.SetSel(0, -1);
m_myEdit.Paste();

CEdit::PosFromChar

调用此函数可获取此 CEdit 对象中给定字符的位置(左上角)。

CPoint PosFromChar(UINT nChar) const;

参数

nChar
指定字符的从零开始的索引。

返回值

nChar 指定的字符左上角的坐标。

注解

通过为字符提供从零开始的索引值来指定字符。 如果 nChar 大于 CEdit 对象中最后一个字符的索引,则返回值指定刚刚超过 CEdit 对象中最后一个字符的字符位置的坐标。

注意

此成员函数从 Windows 95 和 Windows NT 4.0 开始可用。

有关详细信息,请参阅 Windows SDK 中的 EM_POSFROMCHAR

示例

请参阅 CEdit::LineFromChar 的示例。

CEdit::ReplaceSel

调用此函数,将编辑控件中的当前选定内容替换为 lpszNewText 指定的文本。

void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE);

参数

lpszNewText
指向包含替换文本的以 null 结尾的字符串。

bCanUndo
若要指定可撤消此函数,请将此参数的值设置为 TRUE。 默认值是 FALSE。

备注

仅替换编辑控件中的一部分文本。 如果要替换所有文本,请使用 CWnd::SetWindowText 成员函数。

如果当前未选定任何内容,替换文本将插入到当前光标位置。

有关详细信息,请参阅 Windows SDK 中的 EM_REPLACESEL

示例

请参阅 CEdit::LineIndex 的示例。

CEdit::SetCueBanner

设置当控件为空时,在编辑控件中显示为文本提示或提示的文本。

BOOL SetCueBanner(LPCWSTR lpszText);

BOOL SetCueBanner(
    LPCWSTR lpszText,
    BOOL fDrawWhenFocused = FALSE);

参数

lpszText
[in] 指向字符串的指针,其中包含要在编辑控件中显示的提示。

fDrawWhenFocused
[in] 如果为 FALSE,则当用户在编辑控件中单击并将焦点置于该控件时,不会绘制提示横幅。

如果为 TRUE,则即使控件具有焦点,也会绘制提示横幅。 当用户开始在控件中键入内容时,提示横幅将消失。

默认值是 FALSE。

返回值

如果此方法成功,则为 TRUE;否则为 FALSE。

备注

此方法将发送 EM_SETCUEBANNER 消息,如 Windows SDK 中所述。 有关详细信息,请参阅 Edit_SetCueBannerTextFocused 宏。

示例

下面的示例演示了 CEdit::SetCueBanner 方法。

m_cedit.SetCueBanner(_T("First, enter text here..."), TRUE);

CEdit::SetHandle

调用此函数,将句柄设置为多行编辑控件要使用的本地内存。

void SetHandle(HLOCAL hBuffer);

参数

hBuffer
包含本地内存的句柄。 必须已使用 LMEM_MOVEABLE 标志由先前对 Windows 函数 LocalAlloc 的调用来创建此句柄。 假定内存包含以 null 结尾的字符串。 如果并非如此,则分配的内存的第一个字节应设置为 0。

备注

编辑控件随后将使用此缓冲区来存储当前显示的文本,而不是分配其自己的缓冲区。

此成员函数仅由多行编辑控件处理。

在应用程序设置新的内存句柄之前,它应使用 GetHandle 成员函数获取当前内存缓冲区的句柄,并使用 Windows 函数 LocalFree 释放该内存。

SetHandle 会清除撤消缓冲区(CanUndo 成员函数随后返回 0)和内部修改标志(GetModify 成员函数随后返回 0)。 会重新绘制编辑控制窗口。

只有在设置了 DS_LOCALEDIT 样式标志的情况下创建对话框时,才能在对话框中的多行编辑控件中使用此成员函数。

注意

GetHandle 不适用于 Windows 95/98。 如果在 Windows 95/98 中调用 GetHandle,它将返回 NULL。 GetHandle 将按 Windows NT 3.51 及更高版本中所述工作。

有关详细信息,请参阅 Windows SDK 中的 EM_SETHANDLELocalAllocLocalFree

示例

// The string to set in the edit control.
CString strString(_T("George Frideric"));

// Initialize the new local handle.
size_t cbSize = (strString.GetLength() + 1) * sizeof(TCHAR);
HLOCAL h = ::LocalAlloc(LHND, cbSize);
LPTSTR lpszText = (LPTSTR)::LocalLock(h);
_tcsncpy_s(lpszText, cbSize / sizeof(TCHAR), strString, _TRUNCATE);
::LocalUnlock(h);

// Free the current text handle of the edit control.
::LocalFree(m_myEdit.GetHandle());

// Set the new text handle.
m_myEdit.SetHandle(h);

CEdit::SetHighlight

突出显示当前编辑控件中显示的文本范围。

void SetHighlight(
    int ichStart,
    int ichEnd);

参数

ichStart
[in] 要突出显示的文本范围中第一个字符的从零开始的索引。

ichEnd
[in] 要突出显示的文本范围中最后一个字符的从零开始的索引。

备注

此方法将发送 EM_SETHILITE 消息,如 Windows SDK 中所述。 此方法将发送 EM_SETHILITE 消息,如 Windows SDK 中所述。 SetHighlightGetHighlight 均仅对 UNICODE 版本启用。

CEdit::SetLimitText

调用此成员函数以设置此 CEdit 对象的文本限制。

void SetLimitText(UINT nMax);

参数

nMax
新的文本限制(以字符数为单位)。

备注

文本限制是编辑控件可接受的最大文本量(以字符数为单位)。

更改文本限制仅会限制用户可输入的文本。 它不会影响编辑控件中已有的任何文本,也不会影响 CWnd 中的 SetWindowText 成员函数复制到编辑控件的文本长度。 如果应用程序使用 SetWindowText 函数将更多文本放置在编辑控件中,而不是在对 LimitText 的调用中指定,则用户可以删除编辑控件中的任何文本。 但是,除非删除当前选定内容会导致文本低于文本限制,否则文本限制将阻止用户使用新文本替换现有文本。

此函数会替换 Win32 中的 LimitText

有关详细信息,请参阅 Windows SDK 中的 EM_SETLIMITTEXT

示例

请参阅 CEditView::GetEditCtrl 的示例。

CEdit::SetMargins

调用此方法可设置此编辑控件的左右边距。

void SetMargins(
    UINT nLeft,
    UINT nRight);

参数

nLeft
新的左边距的宽度(以像素为单位)。

nRight
新的右边距的宽度(以像素为单位)。

备注

注意

此成员函数从 Windows 95 和 Windows NT 4.0 开始可用。

有关详细信息,请参阅 Windows SDK 中的 EM_SETMARGINS

示例

请参阅 CEditView::GetEditCtrl 的示例。

CEdit::SetModify

调用此函数可设置或清除编辑控件已修改的标志。

void SetModify(BOOL bModified = TRUE);

参数

bModified
TRUE 值表示文本已修改,FALSE 值表示文本未修改。 默认情况下,将设置已修改的标志。

备注

已修改的标志指示是否修改了编辑控件中的文本。 每当用户更改文本时,都会自动设置该标志。 可使用 GetModify 成员函数检索其值。

有关详细信息,请参阅 Windows SDK 中的 EM_SETMODIFY

示例

请参阅 CEdit::GetModify 的示例。

CEdit::SetPasswordChar

调用此函数以设置或移除当用户键入文本时在编辑控件中显示的密码字符。

void SetPasswordChar(TCHAR ch);

参数

ch
指定要显示的字符(并非用户键入的字符)。 如果 ch 为 0,则显示用户键入的实际字符。

备注

设置密码字符时,将为用户键入的每个字符显示该字符。

此成员函数对多行编辑控件没有影响。

调用 SetPasswordChar 成员函数时,CEdit 将使用 ch 指定的字符重新绘制所有可见字符。

如果使用 ES_PASSWORD 样式创建编辑控件,则默认密码字符设置为星号 (*)。 如果在 ch 设置为 0 的情况下调用 SetPasswordChar,则会删除此样式。

有关详细信息,请参阅 Windows SDK 中的 EM_SETPASSWORDCHAR

示例

// Turn off the password mode.
m_myEdit.SetPasswordChar(0);
ASSERT(!(m_myEdit.GetStyle() & ES_PASSWORD));

CEdit::SetReadOnly

调用此函数以设置编辑控件的只读状态。

BOOL SetReadOnly(BOOL bReadOnly = TRUE);

参数

bReadOnly
指定是设置还是移除编辑控件的只读状态。 如果值为 TRUE,则将状态设置为只读;如果值为 FALSE,则将状态设置为读/写。

返回值

如果操作成功,则为非零值;如果发生错误,则为 0。

备注

通过测试 CWnd::GetStyle 的返回值中的 ES_READONLY 标志,可找到当前设置。

有关详细信息,请参阅 Windows SDK 中的 EM_SETREADONLY

示例

// Set the edit control to be read-only.
m_myEdit.SetReadOnly(TRUE);
ASSERT(m_myEdit.GetStyle() & ES_READONLY);

CEdit::SetRect

调用此函数以使用指定的坐标设置矩形的维度。

void SetRect(LPCRECT lpRect);

参数

lpRect
指向 RECT 结构或 CRect 对象,它指定格式化矩形的新维度。

备注

此成员仅由多行编辑控件处理。

使用 SetRect 来设置多行编辑控件的格式化矩形。 格式化矩形是文本的限制矩形,与编辑控件窗口的大小无关。 首次创建编辑控件时,格式化矩形与编辑控件窗口的工作区相同。 通过使用 SetRect 成员函数,应用程序可使格式化矩形大于或小于编辑控件窗口。

如果编辑控件没有滚动条,并且格式化矩形大于窗口,则将剪裁文本,但不进行换行。 如果编辑控件包含边框,则格式化矩形会减去边框的大小。 如果调整 GetRect 成员函数返回的矩形,必须在将矩形传递给 SetRect 之前移除边框的大小。

调用 SetRect 时,编辑控件的文本也会重新格式化并重新显示。

有关详细信息,请参阅 Windows SDK 中的 EM_SETRECT

示例

// Flag indicating whether to redraw the edit control.
bool fRedraw = TRUE;

CRect r;

m_myEdit.GetRect(&r);

// Reduce the formatting rect of the edit control by
// 10 pixels on each side.
if ((r.Width() > 20) && (r.Height() > 20))
{
   r.DeflateRect(10, 10);

   if (fRedraw)
      m_myEdit.SetRect(&r);
   else
      m_myEdit.SetRectNP(&r);
}

CEdit::SetRectNP

调用此函数以设置多行编辑控件的格式化矩形。

void SetRectNP(LPCRECT lpRect);

参数

lpRect
指向 RECT 结构或 CRect 对象,它指定矩形的新维度。

备注

格式化矩形是文本的限制矩形,与编辑控件窗口的大小无关。

SetRectNPSetRect 成员函数相同,但没有重新绘制编辑控件窗口。

首次创建编辑控件时,格式化矩形与编辑控件窗口的工作区相同。 通过调用 SetRectNP 成员函数,应用程序可使格式化矩形大于或小于编辑控件窗口。

如果编辑控件没有滚动条,并且格式化矩形大于窗口,则将剪裁文本,但不进行换行。

此成员仅由多行编辑控件处理。

有关详细信息,请参阅 Windows SDK 中的 EM_SETRECTNP

示例

请参阅 CEdit::SetRect 的示例。

CEdit::SetSel

调用此函数以在编辑控件中选择一个字符范围。

void SetSel(
    DWORD dwSelection,
    BOOL bNoScroll = FALSE);

void SetSel(
    int nStartChar,
    int nEndChar,
    BOOL bNoScroll = FALSE);

参数

dwSelection
指定起始位置(以低位字为单位)和结束位置(以高位字为单位)。 如果低位字为 0 且高位字为 -1,则选择编辑控件中的所有文本。 如果低位字为 -1,则移除当前选定的所有文本。

bNoScroll
指示是否应滚动到看得见脱字号的位置。 如果为 FALSE,则滚动到看得见脱字号的位置。 如果为 TRUE,则不滚动到看得见脱字号的位置。

nStartChar
指定起始位置。 如果 nStartChar 为 0 且 nEndChar 为 -1,则选择编辑控件中的所有文本。 如果 nStartChar 为 -1,则移除当前选定的所有内容。

nEndChar
指定结束位置。

注解

有关详细信息,请参阅 Windows SDK 中的 EM_SETSEL

示例

请参阅 CEdit::GetSel 的示例。

CEdit::SetTabStops

调用此函数以在多行编辑控件中设置制表位。

void SetTabStops();
BOOL SetTabStops(const int& cxEachStop);

BOOL SetTabStops(
    int nTabStops,
    LPINT rgTabStops);

参数

cxEachStop
指定在每个 cxEachStop 对话框单位中设置制表位。

nTabStops
指定 rgTabStops 中包含的制表位数。 该数字必须大于 1。

rgTabStops
指向一个无符号整数数组,它指定对话框单位中的制表位。 对话框单位是一个水平或垂直的距离。 一个水平对话框单位等于当前对话框基本宽度单位的四分之一,一个垂直对话框单位等于当前对话框基本高度单位的八分之一。 对话框基本单位根据当前系统字体的高度和宽度计算。 GetDialogBaseUnits Windows 函数以像素为单位返回当前对话框基本单位。

返回值

如果设置了制表符,则为非零值;否则为 0。

备注

将文本复制到多行编辑控件时,文本中的任何制表符都会导致生成空间,直到下一个制表位为止。

要将制表位设置为默认大小(即 32 个对话框单位),请调用此成员函数的无参数版本。 要将制表位设置为 32 以外的大小,请调用具有 cxEachStop 参数的版本。 要将制表位设置为大小数组,请使用带有两个参数的版本。

此成员函数仅由多行编辑控件处理。

SetTabStops 不会自动重新绘制编辑窗口。 如果更改编辑控件中已有文本的制表位,请调用 CWnd::InvalidateRect 来重新绘制编辑窗口。

有关详细信息,请参阅 Windows SDK 中的 EM_SETTABSTOPSGetDialogBaseUnits

示例

请参阅 CEditView::SetTabStops 的示例。

CEdit::ShowBalloonTip

显示与当前编辑控件关联的气球状提示。

BOOL ShowBalloonTip(PEDITBALLOONTIP pEditBalloonTip);

BOOL ShowBalloonTip(
    LPCWSTR lpszTitle,
    LPCWSTR lpszText,
    INT ttiIcon = TTI_NONE);

参数

pEditBalloonTip
[in] 指向描述气球状提示的 EDITBALLOONTIP 结构的指针。

lpszTitle
[in] 指向包含气球状提示标题的 Unicode 字符串的指针。

lpszText
[in] 指向包含气球状提示文本的 Unicode 字符串的指针。

ttiIcon
[in] 一个 INT,它指定要与气球状提示关联的图标类型。 默认值为 TTI_NONE。 有关详细信息,请参阅 EDITBALLOONTIP 结构的 ttiIcon 成员。

返回值

如果此方法成功,则返回 TRUE;否则返回 FALSE。

备注

此函数将发送 EM_SHOWBALLOONTIP 消息,如 Windows SDK 中所述。 有关详细信息,请参阅 Edit_ShowBalloonTip 宏。

示例

第一个代码示例定义一个变量 m_cedit,它用于访问当前编辑控件。 此变量将在下一个示例中使用。

public:
// Variable to access the edit control.
CEdit m_cedit;

下一个代码示例显示编辑控件的气球状提示。 CEdit::ShowBalloonTip 方法会指定标题和气球状提示文本。

m_cedit.ShowBalloonTip(
    _T("CEdit Balloon Tip"), // title
    _T("Here's a tip!"),     // text
    TTI_INFO);

CEdit::Undo

调用此函数以撤消上次编辑控件操作。

BOOL Undo();

返回值

对于单行编辑控件,返回值始终为非零值。 对于多行编辑控件,如果撤消操作成功,则返回值为非零值;如果撤消操作失败,则返回值为 0。

注解

撤消操作也是可撤消的。 例如,可通过第一次调用 Undo 来还原已删除的文本。 只要没有干预编辑操作,就可再调用 Undo 一次来再次移除文本。

有关详细信息,请参阅 Windows SDK 中的 EM_UNDO

示例

// Undo the last operation, if possible.
if (m_myEdit.CanUndo())
   m_myEdit.Undo();

另请参阅

MFC 示例 CALCDRIV
MFC 示例 CMNCTRL2
CWnd 类
层次结构图
CWnd 类
CButton 类
CComboBox 类
CListBox 类
CScrollBar 类
CStatic 类
CDialog 类