Всем привет.
Есть необходимость сделать альтернативную версию 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();
}
Наша панель-тултип будет корректно скрываться.
Комментариев нет:
Отправить комментарий