2009-05-16 64 views
18

Tôi muốn hiển thị chú giải công cụ khi chuột di chuột qua liên kết trong điều khiển chỉnh sửa tùy chỉnh phong phú của tôi. Hãy xem xét văn bản sau:Hiển thị chú giải công cụ trên di chuột của văn bản

Chúng tôi tất cả ngủ vào ban đêm.

Trong trường hợp của tôi từ ngủ là một liên kết.

Khi người dùng di chuyển chuột dưới liên kết, trong trường hợp này là "ngủ", tôi muốn hiển thị chú giải công cụ cho liên kết.

Sau đây đến tâm trí của tôi, nhưng họ không làm việc

1) Bẫy OnMouseHover

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

Tuy nhiên, điều này không làm việc ra.

CẬP NHẬT

Các liên kết được đề cập là không URL, tức là đây là những liên kết tùy chỉnh, vì vậy Regex sẽ không giúp được gì nhiều ở đây, nó có thể được bất kỳ văn bản. Người dùng có thể chọn tạo liên kết đó.

Mặc dù tôi chưa thử phương pháp GetPosition, tôi không nghĩ nó sẽ thanh lịch về thiết kế và bảo trì.

Hãy để tôi nói tôi có dòng sau, trong hộp Richedit tôi

Chúng tôi ngủ vào ban đêm. Nhưng những con dơi ở lại tỉnh táo. Gián trở thành hoạt động vào ban đêm.

Trong câu trên, tôi muốn ba chú giải công cụ khác nhau khi chuột di chuột qua chúng.

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

Tôi bị mắc kẹt OnMouseMove như sau:

làm việc nặng nhọc với 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"); 
    } 
} 

Không làm việc - với Tooltip - Tooltip không hiển thị

OnMouseMove(MouseventArgs e) 
{ 

    if(cursor.current == cursors.hand) 
    { 
    tooltip.show(richeditbox,e.x,e.y,1000); 
    } 
} 
+0

Điều này đã làm được điều đó .. tooltip.Active = true –

+1

Oh Tôi đã không nhận ra vấn đề của bạn là chú giải công cụ ... Dù sao, hãy sử dụng System.Windows. Forms.Cursor.Current để tĩnh nhận con trỏ chuột hiện tại, như trong câu trả lời cuối cùng của tôi. – Shimmy

Trả lời

2

Đây không phải là thanh lịch, nhưng bạn có thể sử dụng phương thức RichTextBox.GetCharIndexFromPosition để trả lại cho bạn chỉ mục của ký tự mà chuột hiện đang kết thúc, và sau đó sử dụng chỉ mục đó để tìm ra nếu nó nằm trên một liên kết, điểm phát sóng, hoặc bất kỳ khu vực đặc biệt nào khác.Nếu có, hãy hiển thị chú giải công cụ của bạn (và có thể bạn muốn chuyển tọa độ chuột vào phương thức Hiển thị của chú giải công cụ, thay vì chỉ chuyển vào hộp văn bản, để chú giải công cụ có thể được đặt bên cạnh liên kết).

Ví dụ ở đây: http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.getcharindexfromposition(VS.80).aspx

+0

Tôi đã làm như sau; chỉ để thử nghiệm trong sự kiện MouseMove của hộp richedit. if (Cursor.Current == Cursors.Hand) Messagebox.Show ("Tooltip Mỹ); Nhưng tooltip của tôi không nhận được hiển thị, một khi tôi thay thế MessageBox với tooltip.show() như sau nếu (Cursor.Current == Cursors.Hand) this.ttpLink.Show ("Hover", txtBox, eX, eY, 1000); Tôi có thiếu gì đó không? –

+0

Jean, ngay cả khi tôi nhận được văn bản làm sao tôi biết atring ia link, –

12

Vâng, hãy xem, công trình này, Nếu bạn có vấn đề xin vui lòng cho tôi biết:

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", ""); 
     } 
    } 
} 
0

Sử dụng:

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

Sử dụng chức năng GetWord từ câu trả lời khác của tôi để có được từ lơ lửng. Sử dụng logic hẹn giờ để tắt chỉnh sửa chú giải công cụ như ở phần trước. thí dụ.

Trong ví dụ này ở trên, đầu công cụ hiển thị từ được di chuột bằng cách kiểm tra con trỏ chuột.

Nếu câu trả lời này vẫn không phải là những gì bạn đang tìm kiếm, vui lòng chỉ định điều kiện mô tả từ bạn muốn sử dụng chú giải công cụ. Nếu bạn muốn chữ in đậm, hãy cho tôi biết.

4

Bạn không nên sử dụng chú giải công cụ kiểm soát riêng, nhưng biểu mẫu một. Ví dụ này hoạt động tốt:

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 
    { 
    } 

} 
0

Tôi cũng muốn nói thêm một cái gì đó ở đây là nếu bạn nạp hình thức mong muốn có chứa tooltip controll trước chạy sau đó kiểm soát mẹo công cụ của chương trình vào mẫu mà sẽ không làm việc như mô tả dưới đây ...

[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); 


    } 

vì vậy tôi giải quyết vấn đề này bằng puting mã sau trong thủ tục sự kiện như thế này Fram_main_load

private void Frm_Main_Load(object sender, EventArgs e) 
    { 
     Program.Showtop(); 
    } 
8

Chỉ cần thêm công cụ ToolTip từ hộp công cụ để hình thành một nd thêm mã này trong một sự kiện MouseMove của bất kỳ điều khiển bạn muốn làm cho tooltip bắt đầu vào MouseMove của nó

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 
    } 

hy vọng nó sẽ giúp

hòa bình

+0

nó là đủ để thiết lập toolTip1.SetToolTip (textBox3, "Tooltip text"), chỉ một lần, không phải mỗi lần mousemove-event được nâng lên. – anion

0

Như không có gì trong câu hỏi này là (nhưng nó tuổi) yêu cầu một giải pháp trong Windows.Forms, đây là một cách để làm điều này trong WPF trong mã-đằng sau.

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; 
0

Nếu bạn đang sử dụng kiểm soát RichTextBox. Bạn có thể chỉ cần xác định đối tượng ToolTip và hiển thị công cụ-tip khi văn bản được chọn bằng cách di chuyển chuột bên trong kiểm soát RichTextBox.

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

Để dễ sử dụng và dễ hiểu.

Bạn chỉ cần đặt Chú giải công cụ ở bất kỳ đâu trên biểu mẫu của mình (từ hộp công cụ). Sau đó bạn sẽ được cung cấp một tùy chọn trong Thuộc tính của mọi thứ khác trong biểu mẫu của bạn để xác định những gì được hiển thị trong Chú giải công cụ đó (nó đọc một cái gì đó như "ToolTip trên toolTip1"). Bất cứ khi nào bạn di chuột vào một đối tượng, văn bản trong thuộc tính đó sẽ được hiển thị dưới dạng chú giải công cụ.

này không bao gồm các chú giải công cụ tùy chỉnh như câu hỏi ban đầu đang yêu cầu. Nhưng tôi để lại điều này ở đây cho những người khác không cần

Các vấn đề liên quan