6

当我使用 RichTextBox.Select(int start, int length) 函数在包含超链接的富文本框中选择文本时,当我尝试选择超链接之后的任何文本时,选择会发生一些变化。

当我删除超链接时,选择工作正常。

编辑: 我使用 RichTextBox 5(Visual Studio 中的默认版本是 4)

public class RichText50W : RichTextBox
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr LoadLibrary(string lpFileName);
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams prams = base.CreateParams;
            if (LoadLibrary("msftedit.dll") != IntPtr.Zero)
            {
                prams.ClassName = "RICHEDIT50W";
            }
            return prams;
        }
    }
}

该问题仅发生在 Richtextbox 5+ 上。

这些图像显示了问题和行为差异。

如果您尝试这样做,请确保将richtextboxes 的 HideSelection 属性设置为“false”。

选择功能显示在按钮上。

选择 (10, 1)

对于 RTB5,应在上图中选择“文本”中的“e”。

选择 (40, 1)

选择 (46, 1)

显然 RTB5 选择了一些隐藏的文本。

我需要它仅根据可见文本进行选择。

RTB 4 在使用表格时有问题,所以我不想使用它。

我使用 .NET 2.0

编辑:要在 Visual Studio 中尝试此操作,请从默认的 Richtextbox 开始,并将其声明更改为 RichText50W 而不是 RichTextBox

RichEdit 6 也有同样的问题。

谢谢

4

2 回答 2

2

根据我自己的经验,“RICHEDIT50W”版本在与嵌入式超链接或隐藏文本(使用 rtf 代码 \v \v0)一起使用时会严重损坏。

在您的 v5 框中,该Text.Length属性报告 14 个字符——它显示的内容。该TextLength属性报告 51 个字符。和属性都报告“隐藏文本”数字SelectionStartSelectionLength但该控件不再为您提供获取隐藏文本的方法。这意味着当您的富文本包含隐藏字符时,“文本”和相关的“文本选择”信息将变得不可用。

我认为唯一的解决方案是如果会有隐藏字符或浏览市场以获得更好的富文本控件,则不要使用“RICHEDIT50W”版本。

于 2012-10-24T16:32:39.143 回答
0

只是晚了一点。这可能有帮助,也可能没有帮助,我还没有使用过这个控件。以下代码从http://www.codeproject.com/Messages/3401956/NET-Richedit-Control.aspx复制。注意// Check Unicode or ANSI system and set appropriate ClassName.

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace RichEditor
{
  public class RichTextBoxEx : RichTextBox
  {
    private IntPtr mHandle = IntPtr.Zero;

    protected override CreateParams CreateParams
    {
      get
      {
        //Prevent module being loaded multiple times.
        if (this.mHandle == IntPtr.Zero)
        {
          //load the library to obtain an instance of the RichEdit50 class.
          this.mHandle = LoadLibrary("msftedit.dll");
        }

        //If module loaded, reset ClassName.
        if (this.mHandle != IntPtr.Zero)
        {
          CreateParams cParams = base.CreateParams;

          // Check Unicode or ANSI system and set appropriate ClassName.
          if (Marshal.SystemDefaultCharSize == 1)
          {
            cParams.ClassName = "RichEdit50A";
          }
          else
          {
            cParams.ClassName = "RichEdit50W";
          }

          return cParams;
        }
        else // Module wasnt loaded, return default .NET RichEdit20 CreateParams.
        {
          return base.CreateParams;
        }
      }
    }


    ~RichTextBoxEx()
    {
      //Free loaded Library.
      if (mHandle != IntPtr.Zero)
      {
        FreeLibrary(mHandle);
      }
    }

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr LoadLibrary(String lpFileName);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool FreeLibrary(IntPtr hModule);
  }
}
于 2014-12-06T11:59:01.050 回答