有没有办法测试控件是 Edit 还是 RichEdit?
Is there a way to test if a control is Edit or RichEdit?
基本上,我用 C# 编写了一个程序,它使用 user32.dll 从任何 window 句柄中获取文本和当前插入符位置。处理文本后,程序将控件的文本设置为新字符串并重置插入符号位置。
我 运行 遇到的问题是 EM_GETSEL
returns RichEdit 控件的插入符号位置基于插入符号位置前的 CR+LF 数量。
Edit 控件将它们视为两个字符,而 RichEdit 控件将它们视为一个 "character"。
我是否可以通过 windows 消息检测这两个控件中的哪一个?
或者是否有更好的方法来检测非托管控件的插入符位置?
你的观察不准确。
Rich Edit 不会将 CRLF 计为 1 个字符,但它不会将 CRLF (\r\n) 用于换行符,而只会使用 LF (\n)。当您检查 Rich Edit 的文本内容时,您会看到这一点。换行符仅作为 \n 返回,而不是 \r\n.
您可以在 .net Winforms RichEdit 控件中看到相同的行为:
var before = "Line1\r\nLine2";
richTextBox1.Text = before;
var after = richTextBox1.Text;
MessageBox.Show(string.Format("Before: {0} After: {1}", before.Length, after.Length));
这将显示 "Before: 12 After: 11"。文本中的换行符\r\n在文本赋值给rich edit时转换为\n
好的各位,谢谢大家的帮助!这个解释有点草率,还请多多包涵
我今天有了突破,我能够确定一种简单的方法来区分 Edit 或 RichEdit 控件。
因为我们知道 WM_GETTEXT
returns 原始字符串和 EM_GETSEL
将在每个换行符处偏移 1,所以我们所要做的就是检查以下内容:
- 我们是否离开了第一行(第 0 行)?
- 如果我们大于第零行,使用
EM_LINEINDEX
(我在这里使用循环来增加
wParam
我会在一秒钟内解释原因)以获取子字符串
从字符 0 到 EM_LINEINDEX
- 检查该子串是否
包含一个 \r (如果没有,那么你在某处有一个自动换行。这是
为什么我在步骤 2)
中使用循环
- 一旦找到子字符串 \r,就这样做
子字符串还包含 \n?
同样,这是有效的,因为即使 EM_LINEINDEX
在 RichEdit 中与 WM_GETTEXT
相差 1 个字符,因此从字符 0 到第一个换行符之后的 EM_LINEINDEX
的子字符串不会如果您的控件是 RichEdit,则包含 \n。
基本上,我用 C# 编写了一个程序,它使用 user32.dll 从任何 window 句柄中获取文本和当前插入符位置。处理文本后,程序将控件的文本设置为新字符串并重置插入符号位置。
我 运行 遇到的问题是 EM_GETSEL
returns RichEdit 控件的插入符号位置基于插入符号位置前的 CR+LF 数量。
Edit 控件将它们视为两个字符,而 RichEdit 控件将它们视为一个 "character"。
我是否可以通过 windows 消息检测这两个控件中的哪一个?
或者是否有更好的方法来检测非托管控件的插入符位置?
你的观察不准确。
Rich Edit 不会将 CRLF 计为 1 个字符,但它不会将 CRLF (\r\n) 用于换行符,而只会使用 LF (\n)。当您检查 Rich Edit 的文本内容时,您会看到这一点。换行符仅作为 \n 返回,而不是 \r\n.
您可以在 .net Winforms RichEdit 控件中看到相同的行为:
var before = "Line1\r\nLine2";
richTextBox1.Text = before;
var after = richTextBox1.Text;
MessageBox.Show(string.Format("Before: {0} After: {1}", before.Length, after.Length));
这将显示 "Before: 12 After: 11"。文本中的换行符\r\n在文本赋值给rich edit时转换为\n
好的各位,谢谢大家的帮助!这个解释有点草率,还请多多包涵
我今天有了突破,我能够确定一种简单的方法来区分 Edit 或 RichEdit 控件。
因为我们知道 WM_GETTEXT
returns 原始字符串和 EM_GETSEL
将在每个换行符处偏移 1,所以我们所要做的就是检查以下内容:
- 我们是否离开了第一行(第 0 行)?
- 如果我们大于第零行,使用
EM_LINEINDEX
(我在这里使用循环来增加wParam
我会在一秒钟内解释原因)以获取子字符串 从字符 0 到EM_LINEINDEX
- 检查该子串是否 包含一个 \r (如果没有,那么你在某处有一个自动换行。这是 为什么我在步骤 2) 中使用循环
- 一旦找到子字符串 \r,就这样做 子字符串还包含 \n?
同样,这是有效的,因为即使 EM_LINEINDEX
在 RichEdit 中与 WM_GETTEXT
相差 1 个字符,因此从字符 0 到第一个换行符之后的 EM_LINEINDEX
的子字符串不会如果您的控件是 RichEdit,则包含 \n。