RichTextBox 一次添加多个超链接问题

逍遥先森丶 2018-06-12 09:37:11


上图是我想实现的效果。
网上找的资料。利用SendMessage来给RichTextbox添加超链接,通过RichTextbox的LinkClicked事件去打开文件夹和文件。

目前的问题是:
单独实现一个打开文件夹或者打开文件都是没有问题的,但是如果想两个同时实现,第一个获取到的LinkText,,是被截取了后半部分的,导致我打开文件夹目录始终不对,但是第二个打开文件功能是正常的。由于小弟对这API实在不了解。请求大神不吝赐教!
代码下面贴出。


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

[DllImport("user32.dll ", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam,
[In, Out, MarshalAs(UnmanagedType.LPStruct)] CHARFORMAT2A lParam);

public const int CFE_LINK = 0x20;
public const int CFM_LINK = 0x20;
public const int EM_SETCHARFORMAT = 0x444;
public const int SCF_SELECTION = 1;

private void Form1_Load(object sender, EventArgs e)
{

}


private void button1_Click(object sender, EventArgs e)
{
FileMsgAdd(@"打开所在文件夹", @"#" + Application.StartupPath + "\\ReceiveFile\\", richTextBox1);
this.richTextBox1.AppendText(" ");
FileMsgAdd(@"打开文件", @"#" + Application.StartupPath + "\\ReceiveFile\\22.txt", richTextBox1);
}

private void FileMsgAdd(string fileMsg, string path, RichTextBox box)
{
string insertRtf = @"{\rtf1" + TextToRtf(fileMsg) + @"\v" + TextToRtf(path) + @"\v0}";
int iniPos = box.SelectionStart;
box.SelectedRtf = insertRtf;
box.SelectionStart = iniPos;
box.SelectionLength = fileMsg.Length + path.Length;

CHARFORMAT2A vCharFormat2a = new CHARFORMAT2A();
vCharFormat2a.cbSize = Marshal.SizeOf(typeof(CHARFORMAT2A));
vCharFormat2a.dwMask = CFM_LINK;
vCharFormat2a.dwEffects = CFE_LINK;
SendMessage(box.Handle, EM_SETCHARFORMAT, SCF_SELECTION,
vCharFormat2a);
}

private string TextToRtf(string AText)
{
string vReturn = "";
foreach (char vChar in AText)
{
switch (vChar)
{
case '\\':
vReturn += @"\\";
break;
case '{':
vReturn += @"\{";
break;
case '}':
vReturn += @"\}";
break;
default:
if (vChar > (char)127)
vReturn += @"\u" + ((int)vChar).ToString() + "?";
else
vReturn += vChar;
break;
}
}
return vReturn;
}

private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(e.LinkText.Substring(e.LinkText.IndexOf('#') + 1));
}
}

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public class CHARFORMAT2A
{
public int cbSize;
public int dwMask;
public int dwEffects;
public int yHeight;
public int yOffset;
public int crTextColor;
public byte bCharSet;
public byte bPitchAndFamily;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
public byte[] szFaceName = new byte[0x20];
public short wWeight;
public short sSpacing;
public int crBackColor;
public int lcid;
public int dwReserved;
public short sStyle;
public short wKerning;
public byte bUnderlineType;
public byte bAnimation;
public byte bRevAuthor;
}
...全文
1110 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
逍遥先森丶 2018-06-28
  • 打赏
  • 举报
回复


具体原因还是没找到,用其他办法解决了。但是还有个问题就是,自定义的文本链接不能和richtextbox的网址自动转链接共存。
  • 打赏
  • 举报
回复
RichTextBox 只是一个富文本框,不合适聊天展示的,建议用webblower制作。
逍遥先森丶 2018-06-14
  • 打赏
  • 举报
回复
引用 5 楼 jiangsheng 的回复:
这个需求用webbrowser控件做比较容易吧,内建超链接支持。只需要改ObjectForScripting然后在点按钮的时候用windows.external调用C#代码来显示文件对话框和改页面HTML。 MFC有个DHTMLExplore示例可以参考一下。
其实这个整体需求是一个类似QQ的聊天工具,在对话框内要实现收到文件后可以直接打开文件或者文件夹。现在问题就是单独一个没有问题,连续调用2次API,好像只有最后一次的是完全无误的,之前的始终有点问题
assky124 2018-06-13
  • 打赏
  • 举报
回复
你在Word里,做出你想要的效果,保存成RTF,然后RichTextBox加载这个文件就好了
逍遥先森丶 2018-06-12
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)] public byte[] szFaceName = new byte[0x20]; -》目测 把这个byte[] 的初始化大小设置的再大些 试试
试过了改成64依然不行,再改大的话,,richtextbox里面显示的都不是超链接了。。不太懂。。
蒋晟 2018-06-12
  • 打赏
  • 举报
回复
这个需求用webbrowser控件做比较容易吧,内建超链接支持。只需要改ObjectForScripting然后在点按钮的时候用windows.external调用C#代码来显示文件对话框和改页面HTML。 MFC有个DHTMLExplore示例可以参考一下。
exception92 2018-06-12
  • 打赏
  • 举报
回复
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)] public byte[] szFaceName = new byte[0x20]; -》目测 把这个byte[] 的初始化大小设置的再大些 试试
逍遥先森丶 2018-06-12
  • 打赏
  • 举报
回复
两个同时实现时,,前面打开文件夹的linktext变成了如下图。


逍遥先森丶 2018-06-12
  • 打赏
  • 举报
回复
有木有大神帮看一下!!还是没查到具体原因啊

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧