Выбор текста присущ только элементу управления, в котором он содержится, и средствам, в которых он хранит этот текст.
Очень простым (хотя и сомнительно неэффективным способом) является запуск алгоритма текстового потока, который вы используете при нажатии на точку и остановка алгоритма, когда вы достигли того, что ближе всего к этой точке. Более продвинутые элементы управления могут кэшировать текстовый макет, чтобы сделать выделение или рисование их содержимого более эффективными. В зависимости от того, сколько вы цените процессорного времени или памяти, существуют способы использования кэшей и особых случаев, чтобы удешевить этот «тест на попадание».
Если вы можете сделать какие-либо утверждения (только один шрифт в элементе управления, поэтому каждая строка имеет одинаковую высоту), то можно сделать эти тесты дешевле, проиндексировав макет шрифта по строкам, а затем выполнив простую арифметику, чтобы выяснить, какой линия была нажата. Если ваш текстовый элемент управления также использует моноширинные шрифты (каждый символ занимает одинаковую ширину и высоту), то вам повезло больше, поскольку вы можете сразу перейти к информации о символах с помощью таблицы поиска и двух простых делений.
Имейте в виду, что написание текстового элемента управления с нуля неприлично сложно . Для лучшей практики содержимое документа следует отделять от отображаемой информации. Причина этого в том, что сам текст необходимо будет редактировать довольно часто, поэтому такие алгоритмы, как Ropes или Gap Buffers, могут использоваться на стороне данных, чтобы обеспечить более быструю вставку вокруг каретки. Каждый раз, когда текст редактируется, он также должен отображаться, что включает в себя получение этих данных и выполнение их с помощью алгоритмов форматирования / потока, чтобы определить, как они должны отображаться пользователю. Обе эти стороны требуют много алгоритмов, которые могут раздражать, чтобы получить право.
К сожалению, использование родных функций TextOut вам не поможет. Вам нужно будет использовать методы, которые дают вам текстовые экстенты для отдельных символов, и более продвинутые (например, многострочные) элементы управления часто должны выполнять свое собственное отображение символов с использованием этой информации. Такие функции, как TextOut, не предназначены, например, для работы с мигающими вставками вставок или для выполнения постепенных обновлений текстовых макетов. Хотя некоторые функции стиля TextOut могут поддерживать перенос слов и выравнивание, они также требуют повторного рендеринга всей строки, что становится более нежелательным пропорционально количеству текста, с которым вам нужно работать в вашем элементе управления.