[200分] RichTextBox 关 于 链 接 的 问 题 , 比 较 困 难

KaKaKaKa 2010-01-19 03:14:59
C# WinForm:

RichTextBox只提供了LinkClick事件,现在我有个额外的需求:

当鼠标移动到richtextbox上某个链接时(未点击哦~),弹出MessageBox,在MessageBox上显示鼠标处链接地址;

------------------------------------------
需要WndProc处,请指点代码。谢谢。
...全文
220 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
KaKaKaKa 2010-01-21
  • 打赏
  • 举报
回复
up
ouc_ajax 2010-01-19
  • 打赏
  • 举报
回复


private System.Collections.ArrayList arr;

private float oneWord;
private void Form1_Load(object sender, EventArgs e)
{
this.richTextBox1.Text += "http://www.1111111111..com\n";
this.richTextBox1.Text += "http://www.baidu.com\n";
this.richTextBox1.Text += "http://www.xiaonei.com\n";
this.richTextBox1.Text += "http://www.2222.2222.com\n";
this.richTextBox1.Text += "http://www.3333333.com\n";
this.richTextBox1.Text += "http://www.44444.com";
this.richTextBox1.Text += "http://www.xiaon2222ei.com";
this.richTextBox1.Text += "http://www.66666666.com\n";
this.richTextBox1.Text += "www.66666666.com\n";

InitializeArr();
}

//初始化字符串数组
private void InitializeArr()
{
arr = new System.Collections.ArrayList();
int i = 0;
Graphics g = this.CreateGraphics();
//计算一个字母的长度
oneWord = (g.MeasureString("00123456789", this.richTextBox1.Font).Width - g.MeasureString("0", this.richTextBox1.Font).Width) / 10.0f;
int maxCount = (int)(this.richTextBox1.Width / oneWord);
string str = string.Empty;
foreach (char charEach in this.richTextBox1.Text)
{
i += System.Text.Encoding.GetEncoding("GB2312").GetByteCount(charEach.ToString());
str += charEach;
//实际规则比这复杂,再改改
if (i == maxCount || charEach == '\n')
{
arr.Add(str);
i = 0;
str = string.Empty;
}
}
if (i < maxCount && i != 0 && str != string.Empty)
{
arr.Add(str);
}
}
private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();

p = System.Diagnostics.Process.Start("IExplore.exe", e.LinkText);
}

private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
try
{
this.textBox1.Text = "";
Point position = e.Location;
System.Drawing.Font font = this.richTextBox1.Font;
Graphics g = this.CreateGraphics();
float height = g.MeasureString("f", font).Height + 2.5f;
//计算出当前鼠标在第几行
int count = (int)Math.Ceiling(position.Y / height);
//行横坐标
int xIndex = (int)Math.Ceiling(position.X / oneWord);
if (arr.Count >= count)
{
string a = arr[count - 1].ToString();
//找出正确的链接地址
foreach (System.Text.RegularExpressions.Match match in System.Text.RegularExpressions.Regex.Matches(a, @"(http:\\)?www.([\w|.]+).com"))
{
if (match.Success)
{
int indexStart = a.IndexOf(match.Value);
int indexEnd = indexStart + match.Value.Length;
if (indexStart <= xIndex && indexEnd >= xIndex)
{
this.textBox1.Text = a;
break;
}
}
}
}
}
catch
{
}
}

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
InitializeArr();
}




我是把链接写到一个TextBox里了,楼主可以试试。
不过分行那个规则需要完善下
Valefish 2010-01-19
  • 打赏
  • 举报
回复
up
KaKaKaKa 2010-01-19
  • 打赏
  • 举报
回复
up
KaKaKaKa 2010-01-19
  • 打赏
  • 举报
回复
up
up
up
知道的朋友
KaKaKaKa 2010-01-19
  • 打赏
  • 举报
回复
wuyq11,谢谢帮顶;
我richtextbox开启了DetectUrls,就是采用系统默认处理方式。
你那个无法获得鼠标处的URL内容呀,而且那个根本无法知道鼠标是停在了链接处
khjian 2010-01-19
  • 打赏
  • 举报
回复
UP
lovexilove 2010-01-19
  • 打赏
  • 举报
回复
up
wuyq11 2010-01-19
  • 打赏
  • 举报
回复
void chatRichTextBox1_MouseMove(object sender, MouseEventArgs e)
{
int i = 0;
Point pt;
pt.X = e.X;
pt.Y = e.Y;
i = RichTextBox1.GetCharIndexFromPosition(pt);
}
KaKaKaKa 2010-01-19
  • 打赏
  • 举报
回复
楼上,TextBox不支持URL链接的,你应该没用过吧?
不过还是谢谢你帮顶了下。。
maomao90 2010-01-19
  • 打赏
  • 举报
回复
和TextBox代码是一样的,没什么区别,你就把它当成TextBox用就行了
tzs2304 2010-01-19
  • 打赏
  • 举报
回复
up

110,571

社区成员

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

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

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