20

カスタムリッチエディットコントロールのリンクにマウスを合わせると、ツールチップが表示されます。次のテキストを検討してください。

私たちは皆夜ます。

私の場合、睡眠という言葉はリンクです。

ユーザーがリンクの下(この場合は「スリープ」)でマウスを動かすと、リンクのツールチップが表示されます。

次のことが頭に浮かびましたが、機能していません

1)OnMouseHoverをトラップする

if(this.Cursor == Cursors.Hand)
   tooltip.Show(textbox,"My tooltip");
else
   tooltip.Hide(textbox);

しかし、これはうまくいきません。

アップデート

記載されているリンクはURLではありません。つまり、これらはカスタムリンクであるため、正規表現はここではあまり役に立ちません。任意のテキストにすることができます。ユーザーはそれをリンクとして作成することを選択できます。

方法は試していませんがGetPosition、デザインやメンテナンスの面でそれほどエレガントではないと思います。

リッチエディットボックスに次の行があるとしましょう

私たちは夜ます。しかし、コウモリは目を覚まし続けます。ゴキブリは夜に活発になります。

上記の文では、マウスを上に置いたときに3つの異なるツールチップが必要です。

sleep -> Human beings
awake -> Nightwatchman here
active -> My day begins

私は次のようにトラップOnMouseMoveしました:

メッセージボックスの操作

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);
   }
}
4

9 に答える 9

15

さて、見てください、これはうまくいきます。問題がある場合は教えてください:

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", "");
        }
    }
}
于 2009-05-17T05:15:54.220 に答える
5

コントロールの private tooltipではなく、フォーム 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
    {
    }

}
于 2009-11-30T10:32:48.733 に答える
2

これはエレガントではありませんが、RichTextBox.GetCharIndexFromPosition メソッドを使用して、現在マウスが置かれている文字のインデックスを返し、そのインデックスを使用して、リンク、ホットスポット、またはその他の特別なエリア。そうである場合は、ツールチップを表示します (ツールチップをリンクの横に配置できるように、マウス座標をテキスト ボックスに渡すだけでなく、ツールチップの Show メソッドに渡すことをお勧めします)。

例: http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.getcharindexfromposition(VS.80).aspx

于 2009-05-16T20:30:40.423 に答える
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 関数を使用して、ホバーされた単語を取得します。前のように、タイマー ロジックを使用してツールチップの再表示を無効にします。例。

上のこの例では、ツール ヒントは、マウス ポインターをチェックすることによってホバーされた単語を表示します。

この回答がまだ探しているものではない場合は、ツールチップを使用したい単語を特徴付ける条件を指定してください。太字で欲しい方は言ってください。

于 2009-05-18T11:13:40.730 に答える
0

また、プログラムの実行前にツールチップ コントロールを含む目的のフォームをロードすると、そのフォームのツール チップ コントロールが以下のように機能しないことをここに追加したいと思います...

    [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();
    }
于 2013-05-09T11:27:20.277 に答える
-1

この質問 (ただし、その年齢) には での解決策を必要とするものは何もないため、コード ビハインドで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;
于 2015-04-08T23:21:47.823 に答える