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 から始めて、その宣言を RichTextBox ではなく RichText50W に変更します。

また、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 に答える