none
ToolTip для графики RRS feed

  • Вопрос

  • Добрый день.

    Вот строка прорисовки прямоугольника на форме

    e.Graphics.DrawRectangle(

    Pens.Red, rec);

    Как подвязать к нему всплывающую подсказку?  
    11 июня 2014 г. 8:12

Ответы

  • Добрый день.

    Создал пустой проект. В коде Form1 написал вот так:

    public partial class Form1 : Form
    {
        Rectangle _rect = new Rectangle(20, 20, 50, 50);
    
        ToolTip _toolTip = new ToolTip() { AutoPopDelay = 5000 };
    
        public Form1()
        {
            InitializeComponent();
            Paint += Form1_Paint;
            MouseMove += Form1_MouseMove;
        }
    
        void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.X > _rect.Left && e.X < _rect.Right && e.Y > _rect.Top && e.Y < _rect.Bottom)
            {
                if (string.IsNullOrWhiteSpace(_toolTip.GetToolTip(this)))
                {
                    _toolTip.SetToolTip(this, "Привет!");
                }
            }
            else
            {
                _toolTip.RemoveAll();
            }
        }
    
        void Form1_Paint(object sender, PaintEventArgs e)
        {
    
            e.Graphics.DrawRectangle(Pens.Red, _rect);
        }
    
    

    При наведении мыши на прямоугольник появляется tooltip, при выведении - исчезает.

    • Предложено в качестве ответа kosuke904 11 июня 2014 г. 12:29
    • Помечено в качестве ответа hochuznat 11 июня 2014 г. 13:54
    11 июня 2014 г. 12:14
    Отвечающий

Все ответы

  • ToolTip можно привязать только к элементу управления. А Ваш прямоугольник - всего лишь изображение на элементе. Так что, увы.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    11 июня 2014 г. 11:42
  • Добрый день.

    Создал пустой проект. В коде Form1 написал вот так:

    public partial class Form1 : Form
    {
        Rectangle _rect = new Rectangle(20, 20, 50, 50);
    
        ToolTip _toolTip = new ToolTip() { AutoPopDelay = 5000 };
    
        public Form1()
        {
            InitializeComponent();
            Paint += Form1_Paint;
            MouseMove += Form1_MouseMove;
        }
    
        void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.X > _rect.Left && e.X < _rect.Right && e.Y > _rect.Top && e.Y < _rect.Bottom)
            {
                if (string.IsNullOrWhiteSpace(_toolTip.GetToolTip(this)))
                {
                    _toolTip.SetToolTip(this, "Привет!");
                }
            }
            else
            {
                _toolTip.RemoveAll();
            }
        }
    
        void Form1_Paint(object sender, PaintEventArgs e)
        {
    
            e.Graphics.DrawRectangle(Pens.Red, _rect);
        }
    
    

    При наведении мыши на прямоугольник появляется tooltip, при выведении - исчезает.

    • Предложено в качестве ответа kosuke904 11 июня 2014 г. 12:29
    • Помечено в качестве ответа hochuznat 11 июня 2014 г. 13:54
    11 июня 2014 г. 12:14
    Отвечающий
  • Браво! :) А если он их штук 50 нарисует? ;)

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    11 июня 2014 г. 12:24
  • Браво! :) А если он их штук 50 нарисует? ;)

    Да хоть 100, придется завести Dictionary<Rectangle, string> и в зависимости от того в какой Rectangle мы попали показывать в ToolTip соответствующий string. ;)
    11 июня 2014 г. 12:28
    Отвечающий
  • Вариант!

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    11 июня 2014 г. 12:29
  • Вариант!

    И это еще не самый большой изврат, на который приходилось идти, пока не перешел на WPF...
    11 июня 2014 г. 12:32
    Отвечающий
  • Добрый вечер!

    Первое - это к kosuke904.

    Почему за меня проголосовали и отметили в качестве ответа пост Алексея Лосева, прошло не так много времени. Это так не по теме....

    Второе - благодарю Алексея за ответ.

    Да хоть 100, придется завести Dictionary<Rectangle, string>

    Вот добавил Dic

    public partial class Form1 : Form
        {
            Rectangle _rect;
            Rectangle _rect2;
            ToolTip _toolTip = new ToolTip() { AutoPopDelay = 5000, ToolTipTitle = "Это", UseAnimation = true };
            Dictionary<Rectangle, string> dic = new Dictionary<Rectangle, string>();
            public Form1()
            {
                InitializeComponent();
                _rect = new Rectangle(20, 20, 50, 50);
                dic.Add(_rect, "_rect");
                _rect2 = new Rectangle(120, 120, 50, 50);
                dic.Add(_rect2, "_rect2");
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                
                
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                e.Graphics.DrawRectangle(Pens.Red, _rect);
                e.Graphics.DrawRectangle(Pens.Red, _rect2);
            }
            protected override void OnMouseMove(MouseEventArgs e)
            {
                base.OnMouseMove(e);
          
                foreach (Rectangle rr in dic.Keys)
                {
                    if (!rr.Contains(e.Location))continue;
                    {
                        _toolTip.SetToolTip(this, dic[rr].ToString());
                    }
                    
                    
                        
                    
                }
            }
        }
    Правда подсказка не сразу пропадает))).
    11 июня 2014 г. 13:54
  • Почему за меня проголосовали и отметили в качестве ответа пост Алексея Лосева, прошло не так много времени.

    "Голосовать" за Вас у меня нет физической возможности :) Я лишь "предложил" Вам сообщение Алексея в качестве ответа. Решать, естественно, Вам (ну, или модератору ;)).

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    11 июня 2014 г. 14:02