Предположим, я хочу, чтобы каждое слово, начинающееся с #
, генерировало событие по двойному щелчку. Для этого я реализовал следующий тестовый код:
private bool IsChannel(Point position, out int start, out int end)
{
if (richTextBox1.Text.Length == 0)
{
start = end = -1;
return false;
}
int index = richTextBox1.GetCharIndexFromPosition(position);
int stop = index;
while (index >= 0 && richTextBox1.Text[index] != '#')
{
if (richTextBox1.Text[index] == ' ')
{
break;
}
--index;
}
if (index < 0 || richTextBox1.Text[index] != '#')
{
start = end = -1;
return false;
}
while (stop < richTextBox1.Text.Length && richTextBox1.Text[stop] != ' ')
{
++stop;
}
--stop;
start = index;
end = stop;
return true;
}
private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
textBox1.Text = richTextBox1.GetCharIndexFromPosition(new Point(e.X, e.Y)).ToString();
int d1, d2;
if (IsChannel(new Point(e.X, e.Y), out d1, out d2) == true)
{
if (richTextBox1.Cursor != Cursors.Hand)
{
richTextBox1.Cursor = Cursors.Hand;
}
}
else
{
richTextBox1.Cursor = Cursors.Arrow;
}
}
Обрабатывает слова, начинающиеся с #
, и делает курсор мыши рукой, когда они наводят курсор на них. Однако у меня есть следующие две проблемы:
- Если я пытаюсь реализовать событие двойного щелчка для
richTextBox1
, я могу определить, когда нажимается слово, однако это слово выделяется (выбирается), чего я бы хотел избежать. Я могу отменить его выбор программным путем, выбрав конец текста, но это вызывает мерцание, которого я хотел бы избежать. Какие есть способы сделать это?
- Метод
GetCharIndexFromPosition
возвращает индекс символа, который находится ближе всего к курсору. Это означает, что если единственное, что содержит мой RichTextBox, это слово, начинающееся с #
, тогда курсор будет рукой, независимо от того, где находится элемент управления расширенным текстом. Как я могу сделать так, чтобы это была только рука, когда она зависает над реальным словом или символом, который является частью слова, которое меня интересует? Реализованное обнаружение URL также частично страдает от этой проблемы. Если я включу обнаружение URL-адресов и только напишу www.test.com
в редакторе форматированного текста, курсор будет стрелкой, если он находится на или ниже ссылке. Однако это не будет рукой, если она находится справа от ссылки. Я в порядке даже с этой функциональностью, если сделать курсор рукой, если и только если он находится на тексте, оказывается слишком сложно.
Полагаю, мне придется прибегнуть к каким-то вызовам API Windows, но я не знаю, с чего начать.
Я использую Visual Studio 2008, и я хотел бы реализовать это сам.
Обновление:
Проблема мерцания была бы решена, если бы я мог сделать так, чтобы ни один текст нельзя было выбрать с помощью двойного щелчка, только путем перетаскивания курсора мыши и программно. Это легче достичь? Потому что мне все равно, можно ли выбрать текст или нет, дважды щелкнув в этом случае.