Как двойным кликом по слову в RichTextBox выделить его и отобразить над ним Panel (панель изначально скрыта и должна появляться когда происходит клик по слову)?
Как вариант можно повесить на RichTextBox событие SelectionChanged(), которое происходит после изменения выбора (выделения) текста в RichTextBox:
private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
// Проверяем что длина выбранного текста больше нуля,
// иначе panel1 станет видимой при вводе текста
if (richTextBox1.SelectedText.Length > 0)
panel1.Visible = true;
else
panel1.Visible = false;
}
Двойным кликом изменится выделение слова и как раз сработает событие richTextBox1_SelectionChanged
Update
Для установления позиции события нужно использовать MouseEventArgs. В моем методе EventHandler не сможет принять MouseEventArgs. Тогда нужно взять за основу метод @AlexanderPetrov. Единственно,
panel.Location = e.Location;
позиция panel будет считаться с левого верхнего угла формы, так как событие происходит в richTextBox, и за начало координат берется верхний левый угол именно richTextBox. То есть Вам нужно еще посчитать координаты Вашей panel:
Координата X будет равна:
e.Location.X + richTextBox1.Location.X - panel1.Width / 2
richTextBox1.Location.X - координата X левого верхнего угла richTextBox1;
e.Location.X - координата X в самом richTextBox1.
Из этой суммы вычитаем panel1.Width / 2, чтобы левый край panel не был над началом слова, а был смещен, т.о. что panel будет надвисать над словом.
Координата Y будет равна:
e.Location.Y + richTextBox1.Location.Y - panel1.Height - richTextBox1.Height
e.Location.Y + richTextBox1.Location.Y - то же самое, что в X.
Из этой суммы вычитаем высоту panel1.Height и richTextBox1.Height, чтобы panel1 не перекрывала richTextBox1.
Итого:
private void richTextBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
int length = richTextBox1.SelectionLength;
// проверяем длину выбранного текста, если что-то выбрано,
// то показываем panel1
if (length > 0)
{
int startIndex = richTextBox1.SelectionStart;
string word = richTextBox1.Text.Substring(startIndex, length).TrimEnd();
int X = e.Location.X + richTextBox1.Location.X - panel1.Width / 2;
int Y = e.Location.Y + richTextBox1.Location.Y - panel1.Height - richTextBox1.Height;
panel1.Location = new Point(X, Y);
panel1.Visible = true;
}
}
Также оставляем событие:
private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
// Если нет выбранного текста,
// скрываем panel1
if (richTextBox1.SelectionLength == 0)
panel1.Visible = false;
}
Слово автоматически выделяется двойным кликом, так что ничего дополнительно делать не нужно.
Показать панель в нужном месте элементарно: координаты клика есть, просто устанавливаем их и вызываем Show.
Дополнительно я написал, как получить выделенное слово.
private void RichTextBox_MouseDoubleClick(object sender, MouseEventArgs e)
{
int startIndex = richTextBox.SelectionStart;
int length = richTextBox.SelectionLength;
string word = richTextBox.Text.Substring(startIndex, length).TrimEnd();
panel.Location = e.Location;
panel.Show();
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости