Пользовательское текстовое поле: выделение и выделение - PullRequest
1 голос
/ 22 февраля 2012

Я опубликовал вопрос, похожий на этот, ранее, однако, подумав об этом и проверив ответы, я считаю, что я неправильно истолковал ответы, а ответчик (-и) неправильно истолковал меня. Оригинальный вопрос здесь . Я думаю, что люди верили, что я просто хотел выделить строки, я не указал свою точную цель. Итак, теперь я буду:

В последнее время я пытался создать текстовое поле 100% с нуля в C ++ CLR с помощью GDI +. Я столкнулся с проблемой размещения каретки, когда пользователь нажимает на текстовое поле. Делая простую математику (где они нажали, разделенные на ширину линии), я могу выяснить, какую линию они нажали. Но для того, чтобы щелкнуть по персонажу, мне нужно (если нет лучшего способа) сравнить ограничивающие прямоугольники всех символов в строке и поместить каретку перед тем, в который вписывается мышь. Для этого мне нужно получить точные границы каждого отдельного символа , а не всей строки.

Я уже попробовал несколько вещей, ни одна из которых, похоже, не сработала:

Я считаю, что не могу использовать эти методы, если нет способов обойти их ограничения. Я надеюсь, что я сделал свою проблему и ожидал решения намного яснее, чем раньше.

1 Ответ

1 голос
/ 22 февраля 2012

Из-за того, как текст кернинг и сглаживание, граница символа зависит от всех символов слева от него. Однако вам не нужно знать границы каждого персонажа, а только те, которые расположены по обе стороны от точки щелчка. Вы можете найти их с помощью бинарного поиска - разделите вашу строку пополам, измерьте ее (используя TextRenderer :: MeasureText) и определите, находится ли она слева или справа от точки щелчка. Продолжайте сужать размер строки, пока не останется только одна возможность.

...