当鼠标悬停在我的自定义富编辑控件中的链接上时,我想显示工具提示。请考虑以下文本:
我们晚上都睡觉。
在我的情况下, sleep 这个词就是一个链接。
当用户在链接下移动鼠标时,在这种情况下“睡眠”,我想显示链接的工具提示。
以下是我的想法,但他们没有工作
1)陷阱OnMouseHover
if(this.Cursor == Cursors.Hand)
tooltip.Show(textbox,"My tooltip");
else
tooltip.Hide(textbox);
但这没有用。
更新
提到的链接是不是网址,即这些是自定义链接,因此Regex在这里不会有太多帮助,它可以是任何文本。用户可以选择将其创建为链接。
虽然我没有尝试GetPosition
方法,但我认为在设计和维护方面不会那么优雅。
让我说我在我的richedit框中有以下行
我们 睡觉 在晚上。但是蝙蝠保持 清醒 。蟑螂夜间变得 活跃 。
在上面的句子中,我想要三个不同的工具提示,当鼠标悬停在它们上面时。
sleep -> Human beings
awake -> Nightwatchman here
active -> My day begins
我被困OnMouseMove
如下:
使用Messagebox
OnMouseMove( )
{
// check to see if the cursor is over a link
// though this is not the correct approach, I am worried why does not a tooltip show up
if(this.Cursor.current == Cursors.hand )
{
Messagebox.show("you are under a link");
}
}
无效 - 使用工具提示 - 工具提示未显示
OnMouseMove( MouseventArgs e )
{
if(cursor.current == cursors.hand )
{
tooltip.show(richeditbox,e.x,e.y,1000);
}
}
答案 0 :(得分:12)
好吧,看看,这个有效,如果你有问题请告诉我:
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1() { InitializeComponent(); }
ToolTip tip = new ToolTip();
void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
if (!timer1.Enabled)
{
string link = GetWord(richTextBox1.Text, richTextBox1.GetCharIndexFromPosition(e.Location));
//Checks whether the current word i a URL, change the regex to whatever you want, I found it on www.regexlib.com.
//you could also check if current word is bold, underlined etc. but I didn't dig into it.
if (System.Text.RegularExpressions.Regex.IsMatch(link, @"^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$"))
{
tip.ToolTipTitle = link;
Point p = richTextBox1.Location;
tip.Show(link, this, p.X + e.X,
p.Y + e.Y + 32, //You can change it (the 35) to the tooltip's height - controls the tooltips position.
1000);
timer1.Enabled = true;
}
}
}
private void timer1_Tick(object sender, EventArgs e) //The timer is to control the tooltip, it shouldn't redraw on each mouse move.
{
timer1.Enabled = false;
}
public static string GetWord(string input, int position) //Extracts the whole word the mouse is currently focused on.
{
char s = input[position];
int sp1 = 0, sp2 = input.Length;
for (int i = position; i > 0; i--)
{
char ch = input[i];
if (ch == ' ' || ch == '\n')
{
sp1 = i;
break;
}
}
for (int i = position; i < input.Length; i++)
{
char ch = input[i];
if (ch == ' ' || ch == '\n')
{
sp2 = i;
break;
}
}
return input.Substring(sp1, sp2 - sp1).Replace("\n", "");
}
}
}
答案 1 :(得分:10)
只需将工具箱中的工具提示工具添加到表单中,然后将此代码添加到要在其鼠标移动中启动工具提示的任何控件的mousemove事件中
private void textBox3_MouseMove(object sender, MouseEventArgs e)
{
toolTip1.SetToolTip(textBox3,"Tooltip text"); // you can change the first parameter (textbox3) on any control you wanna focus
}
希望有所帮助
和平
答案 2 :(得分:5)
您不应该使用控件私有工具提示,而是形成一个。这个例子效果很好:
public partial class Form1 : Form
{
private System.Windows.Forms.ToolTip toolTip1;
public Form1()
{
InitializeComponent();
this.components = new System.ComponentModel.Container();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
MyRitchTextBox myRTB = new MyRitchTextBox();
this.Controls.Add(myRTB);
myRTB.Location = new Point(10, 10);
myRTB.MouseEnter += new EventHandler(myRTB_MouseEnter);
myRTB.MouseLeave += new EventHandler(myRTB_MouseLeave);
}
void myRTB_MouseEnter(object sender, EventArgs e)
{
MyRitchTextBox rtb = (sender as MyRitchTextBox);
if (rtb != null)
{
this.toolTip1.Show("Hello!!!", rtb);
}
}
void myRTB_MouseLeave(object sender, EventArgs e)
{
MyRitchTextBox rtb = (sender as MyRitchTextBox);
if (rtb != null)
{
this.toolTip1.Hide(rtb);
}
}
public class MyRitchTextBox : RichTextBox
{
}
}
答案 3 :(得分:2)
这不是很优雅,但您可以使用RichTextBox.GetCharIndexFromPosition方法返回鼠标当前所在字符的索引,然后使用该索引确定它是否在链接上,热点或任何其他特殊区域。如果是,请显示您的工具提示(并且您可能希望将鼠标坐标传递到工具提示的Show方法,而不是仅仅传入文本框,以便工具提示可以放置在链接旁边。)
答案 4 :(得分:0)
使用:
ToolTip tip = new ToolTip();
private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
Cursor a = System.Windows.Forms.Cursor.Current;
if (a == Cursors.Hand)
{
Point p = richTextBox1.Location;
tip.Show(
GetWord(richTextBox1.Text,
richTextBox1.GetCharIndexFromPosition(e.Location)),
this,
p.X + e.X,
p.Y + e.Y + 32,
1000);
}
}
使用我的其他答案中的GetWord函数来获取悬停的单词。 使用计时器逻辑禁用如上所述重新显示工具提示。示例
在上面的示例中,工具提示通过检查鼠标指针显示悬停的单词。
如果这个答案仍然不符合您的要求,请指定表征您要使用工具提示的单词的条件。 如果你想要粗体字,请告诉我。
答案 5 :(得分:0)
我还想在这里添加一些内容,如果你在程序运行之前加载包含tooltip controll的所需表单,那么该表单上的工具提示控件将无法工作,如下所述......
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
objfrmmain = new Frm_Main();
Showtop();//this is procedure in program.cs to load an other form, so if that contain's tool tip control then it will not work
Application.Run(objfrmmain);
}
所以我通过在Fram_main_load事件过程中放入以下代码来解决这个问题,就像这样
private void Frm_Main_Load(object sender, EventArgs e)
{
Program.Showtop();
}
答案 6 :(得分:0)
由于此问题(但其年龄)中没有任何内容需要Windows.Forms
中的解决方案,因此这是在代码隐藏中WPF
执行此操作的方法。
TextBlock tb = new TextBlock();
tb.Inlines.Add(new Run("Background indicates packet repeat status:"));
tb.Inlines.Add(new LineBreak());
tb.Inlines.Add(new LineBreak());
Run r = new Run("White");
r.Background = Brushes.White;
r.ToolTip = "This word has a White background";
tb.Inlines.Add(r);
tb.Inlines.Add(new Run("\t= Identical Packet received at this time."));
tb.Inlines.Add(new LineBreak());
r = new Run("SkyBlue");
r.ToolTip = "This word has a SkyBlue background";
r.Background = new SolidColorBrush(Colors.SkyBlue);
tb.Inlines.Add(r);
tb.Inlines.Add(new Run("\t= Original Packet received at this time."));
myControl.Content = tb;
答案 7 :(得分:0)
如果您使用的是RichTextBox控件。您可以通过在RichTextBox控件中移动鼠标来简单地定义ToolTip对象并显示工具提示,因为选择了文本。
ToolTip m_ttInput = new ToolTip(); // define as member variable
private void rtbInput_SelectionChanged(object sender, EventArgs e)
{
if (rtbInput.SelectedText.Length > 0)
{
m_ttInput.Show(rtbInput.SelectedText.Length.ToString(), rtbInput, 1000);
}
}
答案 8 :(得分:0)
为了便于使用和理解。
您只需将工具提示放在表单的任何位置(从工具箱中)即可。然后,您将在表单中的其他所有属性中获得一个选项,以确定该工具提示中显示的内容(它的内容类似于“ToolTip on ToolTip1”)。只要您将鼠标悬停在某个对象上,该属性中的文本就会显示为工具提示。
此不涵盖了原始问题所要求的自定义动态工具提示。但是我把这个留给了其他不需要的人