Страницы

Поиск по вопросам

суббота, 15 июня 2019 г.

Реализация альтернативного ToolTip

Всем привет. Есть необходимость сделать альтернативную версию ToolTip. Выбрал WebBrowser на второй форме. Задача такая при наведении на Textbox в form1 должна появляться Form2,на которой и есть тот самой WebBrowser.Но проблема в том что при перемещении мышки на Textbox в Form1, Form2 должна следовать за ним. Но тогда Form1 начинает мигать при каждом появлении Form2. Как сделать так чтобы Form1 не мигала при появлении Form2?
Form2 form2; private void Texbox1_MouseEnter_1(object sender, EventArgs e) { form2 = new form2(); form2.show(Texbox1); } private void Texbox1_MouseLeave_1(object sender, EventArgs e) { f2.Close();
}


Ответ

Не нужно каждый раз создавать (new) и уничтожать (Close) форму - это слишком накладно. Создайте вторую форму один раз (например, в конструкторе основной формы) и показывайте-скрывайте в нужные моменты.
Для этого задайте текстбоксу следующие обработчики событий:
private void TextBox_MouseMove(object sender, MouseEventArgs e) { form2.Location = new Point(MousePosition.X + 5, MousePosition.Y); }
private void TextBox_MouseEnter(object sender, EventArgs e) { if (form2.Visible) return;
form2.Location = new Point(MousePosition.X + 5, MousePosition.Y);
// Здесь задавайте данные на этой форме-тултипе
form2.Show(this); }
private void TextBox_MouseLeave(object sender, EventArgs e) { if (textBox.ClientRectangle.Contains(textBox.PointToClient(MousePosition))) form2.Location = new Point(MousePosition.X + 5, MousePosition.Y); else form2.Hide(); }
Правда, здесь есть недостаток: если основная форма деактивируется при показанной форме-тултипе (например, нажать Atl+Tab или выскочит окошко другого приложения), то наш тултип не скроется. Думаю, это не страшно: достаточно двинуть мышкой на текстбоксе.
Для устранения этого недочёта можно применить таймер, но это тоже как-то не комильфо.

Вообще, использовать форму в качестве тултипа - слишком тяжеловесно. К тому же, именно из-за способности форм (де)активироваться возникает проблема корректного показа обеих.
Достаточно взять Panel (или любой другой компонент-контейнер), на неё поместить всё необоходимое (WebBrowser или RichTextBox). Изначально этой панели задайте свойство Visible = false (скрыта). Родителем панели должна быть сама основная форма (Parent = this). Эту панель нужно разместить перед всеми другими, поэтому вызовите для неё метод panel.BringToFront();
Код в обработчиках событий почти тот же:
private void TextBox_MouseMove(object sender, MouseEventArgs e) { var point = textBox.PointToClient(MousePosition); panel.Location = new Point(point.X + 5, point.Y); }
private void TextBox_MouseEnter(object sender, EventArgs e) { if (panel.Visible) return; var point = textBox.PointToClient(MousePosition); panel.Location = new Point(point.X + 5, point.Y); panel.Show(); }
private void TextBox_MouseLeave(object sender, EventArgs e) { if (textBox.ClientRectangle.Contains(textBox.PointToClient(MousePosition))) { var point = textBox.PointToClient(MousePosition); panel.Location = new Point(point.X + 5, point.Y); } else panel.Hide(); }
И ещё нужно добавить обработку события деактивации основной формы:
private void Form1_Deactivate(object sender, EventArgs e) { panel.Hide(); }
Наша панель-тултип будет корректно скрываться.

Комментариев нет:

Отправить комментарий