Как установить начало выделения на основе положения мыши WinForms

Мне нужно установить начало выделения текстового поля на основе положения мыши, я пытался загрузить текстовое поле двойным щелчком, после загрузки текстового поля мне нужно установить начало выделения на основе положения мыши. (т.е.) если текстовое поле содержит некоторые значения, такие как «abcdef», если курсор мыши находится рядом с «c» при загрузке текстового поля, то начало выбора должно быть после «c».

Я также пробовал это

textBox.GetCharIndexFromPosition(e.Location);

но я не понял,

Заранее спасибо.

С уважением,

Венкатесан Р


person venkatesan r    schedule 22.01.2016    source источник
comment
textBox1.SelectionStart= textBox1.GetCharIndexFromPosition(e.Location);   -  person Reza Aghaei    schedule 22.01.2016
comment
Вы хотите изменить selStart при каждом движении мыши? Или это должно произойти только один раз? В любом случае, какой в ​​этом смысл, когда используется позиция двойного щелчка, но текст еще не загружен? Сомневаюсь, что вся идея хорошо продумана.   -  person TaW    schedule 24.01.2016
comment
Привет @TaW, когда текстовое поле получает фокус, и начало выделения должно быть установлено в середине, если курсор находится в середине текстового поля, мне нужно установить только один раз. я сделал это в WPF, используя событие загрузки textBox, но я не смог найти такое событие и в WinForms   -  person venkatesan r    schedule 25.01.2016
comment
Привет @RezaAghaei Извините, я четко упомянул, что код у меня не работает.   -  person venkatesan r    schedule 25.01.2016
comment
Код @Reza работает просто отлично! Вероятно, вы использовали неправильное событие: private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e) { textBox1.Text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; textBox1.SelectionStart = textBox1.GetCharIndexFromPosition(e.Location); textBox1.SelectionLength = 0; } вам нужен MouseDoubleClick, а не простой DoubleClick, иначе вы пропустите параметр e.Location!   -  person TaW    schedule 25.01.2016


Ответы (1)


Помещение кода @Reza в правильное событие будет работать нормально:

private void textBox_MouseDoubleClick(object sender, MouseEventArgs e)
{
    textBox.Text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  // load the text data here
    // now position the caret onto the mouse position
    textBox.SelectionStart = textBox.GetCharIndexFromPosition(e.Location);
    // and clear a selection
    textBox.SelectionLength = 0;
}

Обратите внимание, что вам нужно использовать MouseDoubleClick, а не простой DoubleClick, иначе вы пропустите параметр e.Location!

Это самый простой и прямой способ получить координаты мыши относительно TextBox.

Если ваш метод загрузки сложен, вы можете вызвать его, передав MouseEventArgs e, но наиболее естественным способом будет просто вызвать его вместо textBox.Text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";.

Если вы хотите, чтобы вы также могли использовать

textBox.SelectionStart = textBoxtextBox1.PointToClient(Control.MousePosition));

Это будет работать в любом событии или методе. PointToClient будет вычислять относительное положение из положения на экране Control.MousePosition.

person TaW    schedule 25.01.2016
comment
привет @TaW, это будет работать нормально, но я не смог получить MouseEventArgs в методе, который я использовал для загрузки текстового поля в своем приложении, мне нужно передать эти аргументы также моему методу, что будет не очень хорошо. Могу ли я получить решение с помощью Control.MousePosition? - person venkatesan r; 28.01.2016
comment
Это один из способов, но обратите внимание, что вам нужно преобразовать его из абсолютной позиции экрана в относительные координаты текстового поля (используя Control.PointToClient). Но вы можете передать MouseEventArgs из MouseDoubleClick в свой метод, если вам нужно. Но еще проще: заменить textBox.Text = 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ; строку вызовом вашего метода! - person TaW; 28.01.2016
comment
Control.PointToClient в смысле, вернет ли он точку мыши текстового поля? - person venkatesan r; 28.01.2016
comment
Console.WriteLine("mouse at: " + e.Location); в MouseDoubleClick (или MouseClick или MouseMove) точно такое же, как Console.WriteLine("Mouse at: " + textBox1.PointToClient(Control.MousePosition)); при вызове из любого места. Обратите внимание, что Control != Control !! Control.Location относится к контроллеру, то есть к мыши, но control.PointToClient относится к некоторому элементу управления, например TextBox, относительно которого координаты!! - Но раздача аргументов или просто местонахождения - все еще самый простой способ пойти имхо. - person TaW; 28.01.2016
comment
привет @TaW, я пробовал это, но он не возвращает правильную позицию. Я попытался использовать mousemove и установить начало выбора, и я использовал флаг, чтобы пропустить, если установлено начало выбора. Является ли это правильным подходом к этому? - person venkatesan r; 29.01.2016
comment
Не уверен насчет флага (и его причины!). Возможно, вам поможет увидеть больше вашего текущего кода. - person TaW; 29.01.2016