【问题标题】:Is there a way to test if a control is Edit or RichEdit?有没有办法测试控件是 Edit 还是 RichEdit?
【发布时间】:2016-03-11 17:09:14
【问题描述】:

基本上,我用 C# 编写了一个程序,该程序使用 user32.dll 从任何窗口句柄中获取文本和当前插入符号的位置。处理完文本后,程序将控件的文本设置为新字符串,并重置插入符号的位置。

我遇到的问题是EM_GETSEL 根据 CR+LF 的插入符号位置的数量返回 RichEdit 控件的插入符号位置。

Edit 控件将它们视为两个字符,而 RichEdit 控件将它们视为一个“字符”。

无论如何我可以通过 Windows 消息检测到这两个控件中的哪一个?

或者有没有更好的方法可以检测非托管控件的插入符号位置?

【问题讨论】:

  • RichEdit 是否将 CRLF 计为一个或两个字符在这里并不重要,只要这样做是一致的:报告位置时,还有长度和更新。在这种情况下,应该没有问题。您是否看到了这方面的实际问题?
  • 使用 GetClassName()
  • 当控件被子类化时,GetClassName() 不会报告有意义的类名,Windows 应用程序中的大多数控件都是这样。

标签: c# newline edit unmanaged richedit


【解决方案1】:

你的观察不准确。

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));

这将显示“之前:12 之后:11”。当文本分配给富编辑时,文本中的换行符\r\n会转换为\n。

【讨论】:

  • 好吧,有道理!
  • 这会导致\n 转换为\r\n 吗? StringBuilder builder = new StringBuilder(bufferSize + 1);SendMessage(focused, WM_GETTEXT, builder.Capacity, builder);
  • 取决于控件的类型。如果是edit,则返回\r\n,如果是richedit,则返回\n。
  • 出于某种原因,当我使用该代码时,字符串生成器对于每个换行符都有 \r\n ,即使来自 RichEdit。此外,该代码是方法的一部分,所以最后:return builder.ToString(); 这是否导致 \n 转换为 \r\n?
  • 我将功能更改为仅返回 stringbuilder 对象,甚至字符仍被记录为 \r\n。我完全迷路了,我应该把它作为一个新问题打开吗?
【解决方案2】:

好的,谢谢大家的帮助!这个解释有点过时了,请耐心等待。

我今天取得了突破,我能够确定一种简单的方法来区分 Edit 或 RichEdit 控件。

由于我们知道 WM_GETTEXT 返回原始字符串,并且 EM_GETSEL 将在每个换行符处减 1,因此我们要做的就是检查以下内容:

  1. 我们是否离开了第一行(第 0 行)?
  2. 如果我们大于第0行,使用EM_LINEINDEX(我这里使用循环增加 wParam 我会在一秒钟内解释为什么)获取子字符串 从字符 0 到 EM_LINEINDEX
  3. 检查该子字符串是否 包含一个 \r (如果没有,那么你在某处有一个自动换行。这是 为什么我在步骤 2 中使用循环)
  4. 一旦找到子字符串 \r,就可以 子字符串还包含 \n?

再次,这是因为即使EM_LINEINDEX 在RichEdit 中对WM_GETTEXT 的偏移量为1 个字符,因此从字符0 到第一个换行符之后的EM_LINEINDEX 的子字符串将不包含\n一个 RichEdit。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    相关资源
    最近更新 更多