当我使用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也存在同样的问题。
由于
答案 0 :(得分:1)
根据我自己的经验,当使用嵌入式超链接或隐藏文本(使用rtf codes \ v \ v0)时,“RICHEDIT50W”版本会被严重破坏。
在您的v5框中,Text.Length
属性报告14个字符 - 它显示的内容。 TextLength
属性报告51个字符。 SelectionStart
和SelectionLength
属性都会报告“隐藏文本”数字,但控件不会为您提供获取隐藏文本的方法。这意味着当富文本中包含隐藏字符时,“文本”和相关的“文本选择”信息将无法使用。
我认为唯一的解决方案是不使用“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);
}
}