カスタムリッチエディットコントロールのリンクの上にマウスを置いたときにツールチップを表示したい。次のテキストを考慮してください。
私たち全員sleep夜。
私の場合、Word sleepはリンクです。
ユーザーがリンクの下、この場合は「スリープ」の下にマウスを移動すると、リンクのツールチップが表示されます。
次のことが思い浮かびましたが、機能していません
1)OnMouseHoverのトラップ
if(this.Cursor == Cursors.Hand)
tooltip.Show(textbox,"My tooltip");
else
tooltip.Hide(textbox);
しかし、これはうまくいきません。
[〜#〜] update [〜#〜]
記載されているリンクはnot URLです。つまり、これらはカスタムリンクです。したがって、Regexはここではあまり役に立ちません。テキストでもかまいません。ユーザーは、リンクとして作成することを選択できます。
GetPosition
メソッドを試したことはありませんが、設計と保守の点でそれほどエレガントだとは思いません。
リッチエディットボックスに次の行があるとしましょう
夜sleepしかし、コウモリはawakeのままです。ゴキブリは夜にactiveになります。
上記の文では、マウスがそれらの上にあるときに3つの異なるツールチップが必要です。
sleep -> Human beings
awake -> Nightwatchman here
active -> My day begins
次のようにOnMouseMove
をトラップしました。
Working- with 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);
}
}
さて、見てください、これは動作します、問題がある場合は教えてください:
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", "");
}
}
}
ToolTipツールをツールボックスからフォームに追加し、このコードをmousemoveでツールチップを開始するコントロールの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
}
それが役に立てば幸い
平和
control private tooltipを使用するべきではありませんが、form oneを使用する必要があります。この例はうまくいきます:
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
{
}
}
これはエレガントではありませんが、RichTextBox.GetCharIndexFromPositionメソッドを使用して、マウスが現在上にある文字のインデックスを返し、そのインデックスを使用して、リンク、ホットスポット、またはその他の特別なエリア。そうである場合は、ツールチップを表示します(おそらく、ツールチップをリンクの隣に配置できるように、テキストボックスを渡すのではなく、マウス座標をツールチップのShowメソッドに渡す必要があります)。
使いやすさとわかりやすさのため。
フォームの任意の場所(ツールボックスから)にツールチップを配置できます。次に、フォームの他のすべてのプロパティのオプションで、そのツールチップに表示される内容を決定します(「ToolTip on toolTip1」など)。オブジェクトにカーソルを合わせると、そのプロパティのテキストがツールチップとして表示されます。
これはしない元の質問が求めているようなカスタムのオンザフライツールチップをカバーします。しかし、私はこれを必要としない他の人のためにここに残しています
また、プログラムの実行前にツールチップ制御を含む目的のフォームをロードすると、そのフォームのツールチップ制御が以下で説明するように機能しないことをここに追加します...
[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();
}
使用する:
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関数を使用して、ホバーされたWordを取得します。タイマーロジックを使用して、前のようにツールチップの再表示を無効にします。例。
上のこの例では、マウスポインターをチェックすることで、ツールヒントにホバーされたWordが表示されます。
それでもこの答えがあなたが探しているものではない場合、ツールチップを使用したいWordを特徴付ける条件を指定してください。太字のWordで使用する場合は、教えてください。
RichTextBoxコントロールを使用している場合。 RichTipBoxコントロール内でマウスを移動することにより、単に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);
}
}
この質問には(ただしその年齢には)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;