在包含超链接的richtext框v5中选择文本时发生奇怪的移位

时间:2012-10-23 21:57:10

标签: c# winforms richtextbox selection rtf

当我使用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”。

选择功能显示在按钮上。

Select (10, 1)

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

Select (40, 1)

Select (46, 1)

显然RTB5会选择一些隐藏文字。

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

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

我使用.NET 2.0

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

RichEdit 6也存在同样的问题。

由于

2 个答案:

答案 0 :(得分:1)

根据我自己的经验,当使用嵌入式超链接或隐藏文本(使用rtf codes \ v \ v0)时,“RICHEDIT50W”版本会被严重破坏。

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

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

答案 1 :(得分: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);
  }
}
相关问题