Смежный вопрос: Получение индекса строки на основе смещения в пикселях
Я знаю, что это близко к этому вопросу, но это не вопрос, как сделать это напрямую, это вопроскак подделать это лучше всего.
Я реализую свое собственное текстовое поле для Windows Forms (потому что RichTextBox отстой) и пытаюсь найти лучший способ, учитывая строки, которые были нарисованы на экране, вычислить, над каким символом находится мышь.Проблема в том, что символы могут быть переменной ширины.
У меня есть две возможности:
Делать Graphics.MeasureCharacterRange
каждый раз, когда мышь двигается в режиме бинарного поиска на строке, над которой находится мышь (как предложено в вопросе, связанном сверху)
Сохранение списка смещений для каждого символа каждой строки.
(1) будет иметь плохую производительность, а
(2) будет неэффективно в памяти, плюс ввод текста становится операцией O (n) (потому чтоВы должны отрегулировать смещение каждого символа после него) плюс невозможно сделать точно, потому что Graphics.MeasureCharacterRange
не является точным (он возвращает одно значение для одного символа, другое значение для другого символа и совершенно другоезначение [которое не равно двум предыдущим значениям, добавленным вместе] для них обоих вместе в одну строку: например, W
будет иметь ширину 16 пикселей и f
будет шириной 5 пикселей, но Wf
имеет ширину 20 пикселей.Эти цифры отфактический тест.).
Так что я ищу лучшую стратегию для этого, предпочтительно ту, которая требует минимального пространства и O (1) вычислительной сложности (хотя я с радостью обменяю небольшую эффективность памяти на скоростьКПД).