编辑控件文本操作
系统会自动处理所有用户启动的文本操作,并在操作完成后通知应用程序。
以下主题讨论用户启动的文本操作和应用程序的响应:
- 选择编辑控件
- 设置和检索文本
- 选择文本
- 替换文本
- 更改编辑控件使用的字体
- 剪切、复制、粘贴和清除操作
- 修改文本
- 限制用户输入的文本
- 字符和行操作
- 在编辑控件中滚动文本
- 设置制表位和边距
- 隐藏用户输入
- 使用整数
- 撤消文本操作
- 处理自动换行和换行符
- 检索点和字符
- 自动完成字符串
- 编辑控件中的复杂脚本
选择编辑控件
用户可以通过用鼠标单击控件或按 TAB 键移动到控件来选择编辑控件。 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 KB。 应用程序可以通过向控件发送 EM_SETLIMITTEXT 消息来更改默认限制。 此消息对用户可以进入编辑控件的字节数设置硬性限制,但不会影响发送消息时控件中已存在的文本,也不会影响通过 SetDlgItemText 函数或 WM_SETTEXT 消息复制到控件的文本。 例如,假设应用程序使用 SetDlgItemText 函数在编辑控件中放置 500 字节,用户还会输入 500 字节(总计 1,000 字节)。 如果应用程序随后发送 EM_SETLIMITTEXT 消息,将用户输入的文本限制为 300 字节,则保留编辑控件中已有的 1,000 字节,并且用户无法再添加任何文本。 另一方面,如果应用程序发送 EM_SETLIMITTEXT 消息,将用户输入的文本限制为 1,300 字节,则保留 1,000 字节,但用户可以再添加 300 字节。
当用户达到编辑控件的字符限制时,系统会向应用程序发送包含 EN_MAXTEXT 通知代码的 WM_COMMAND 消息。 此通知代码并不意味着内存已用尽,但已达到用户输入文本的限制;用户无法再输入任何文本。 若要更改此限制,应用程序必须向控件发送具有更高限制的新 EM_SETLIMITTEXT 消息。
例如,使用 EM_SETLIMITTEXT 和 EN_MAXTEXT,假设应用程序必须限制用户在编辑控件中输入不超过四个字符。 应用程序将使用 EM_SETLIMITTEXT 来指定四个字符的限制。 如果用户尝试输入第五个字符,系统将向应用程序发送 EN_MAXTEXT 通知代码。
字符和行操作
有几条消息返回有关编辑控件中字符和行的信息。 大多数消息返回索引(通常是从零开始的数字)来引用字符或行。 例如,在包含 n 个字符的单行编辑控件中,行索引为零,字符从零开始编制索引到 n-1。 在包含 m 行和 n 个字符的多行编辑控件中,行从零开始编制索引到 m-1,字符从零开始编制索引到 n-1。 请注意,字符索引编制忽略换行符。
应用程序可以通过将 WM_GETTEXTLENGTH 消息发送到编辑控件来确定编辑控件中的字符数。 此消息返回单行或多行编辑控件中文本的长度(以字符为单位,不包括终止 null 字符)。 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 消息在多行编辑控件中设置制表位。 (制表位的默认值为 8 个字符。)当应用程序将文本添加到编辑控件时,文本中的制表符会自动生成空间,直到下一个制表位。 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 函数,行始终以单词之间的空格结尾。 应用程序可以通过提供 EditWordBreakProc Wordwrap 函数并向编辑控件发送 EM_SETWORDBREAKPROC 消息来指定自己的 Wordwrap 函数。 应用程序可以通过向控件发送 EM_GETWORDBREAKPROC 消息来检索当前 Wordwrap 函数的地址。
应用程序可以指示多行编辑控件在换行文本行末尾自动添加或删除软换行符(两个回车符和一个换行符)。 应用程序可以通过向编辑控件发送 EM_FMTLINES 消息来打开或关闭此功能。 此消息仅适用于多行编辑控件,不会影响以硬换行符结尾的行(用户输入的一个回车符和一个换行符)。 在多行编辑控件中,应用程序还可以指定 ES_WANTRETURN 样式,以在用户在编辑控件中按 Enter 键时请求系统插入回车符。
检索点和字符
若要确定离编辑控件工作区中指定点最近的字符,请向控件发送 EM_CHARFROMPOS 消息。 该消息返回最接近该点的字符的字符索引和行索引。 同样,可以通过发送 EM_POSFROMCHAR 消息来检索指定字符的工作区坐标。 该消息返回指定字符左上角的 x 和 y 坐标。
自动完成字符串
自动完成将部分输入编辑控件中的字符串展开为完整的字符串。 例如,当用户开始在嵌入 Windows Internet Explorer 工具栏的地址编辑控件中输入 URL 时,自动完成会将字符串扩展到与现有部分字符串一致的一个或多个完整 URL。 部分 URL 字符串(如“mic”)可能扩展为 "https://www.microsoft.com" 或 "https://www.microsoft.com/windows"。 自动完成通常用于编辑控件或具有嵌入编辑控件的控件。
有关详细信息,请参阅 IAutoComplete 和 IAutoComplete2 接口文档。
编辑控件中的复杂脚本
复杂脚本是一种语言,其打印形式不以简单方式布局。 例如,复杂脚本可能允许双向呈现、字形的上下文调整或组合字符。 标准编辑控件已扩展,以支持多语言文本和复杂脚本。 这不仅包括输入和显示,还包括正确的光标在字符群集上移动(例如,在泰文和 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 是另一组函数,用于对处理复杂脚本进行精细控制。 有关详细信息,请参阅 Uniscribe。