【问题标题】:Strange shift when Selecting text in richtext box v5 that contains hyperlinks在包含超链接的富文本框 v5 中选择文本时出现奇怪的偏移
【发布时间】:2012-10-13 22:44:00
【问题描述】:

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

选择功能显示在按钮上。

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

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

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

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

我使用 .NET 2.0

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

RichEdit 6 也有同样的问题。

谢谢

【问题讨论】:

  • 你确定吗?我已经测试过了,它运行良好,你能发布你的代码吗?
  • 我用图片和更多细节更新了问题。

标签: c# winforms richtextbox selection rtf


【解决方案1】:

只是有点晚了。这可能有帮助,也可能没有帮助,我还没有使用过这个控件。以下代码是从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);
  }
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 不幸的是,富文本框 4 在表格方面非常糟糕,所以我不适合使用它。你知道解决这些问题的另一个版本吗?
    • @Jerry 是的,表格在 v4 上不是很好。您将不得不查看市场或尝试 WPF 版本。 TextControl 打了很多广告。我没有使用这些第 3 方控件的经验,因此我不能推荐一个可以解决您遇到的这个确切问题的控件。
    • @Jerry 在黑暗中射击:我唯一能想到的就是尝试 WPF 版本的 RichTextBox 并将其放入 ElementHost 控件中。
    • @Jerry 因此引用了 ElementHost。见Put WPF control into a Windows Forms Form
    • @Jerry 在这个话题上对你来说事情似乎变得越来越糟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多