Важно: нам действительно нужна заявленная функциональность, поэтому, пожалуйста, не начинайте предлагать альтернативы.
Мы пытаемся отображать и вводить текст в пользовательском элементе управления WinForms, который включает текстовые и нетекстовые области, другими словами, современный холст.
Мы должны иметь возможность отображать текст и курсор на пользовательском элементе управления при различных уровнях масштабирования и с использованием других пользовательских эффектов. Однако мы не хотим (или не располагаем необходимыми средствами) писать код метода ввода с клавиатуры и мыши, код служб строки и т. Д. - решение должно поддерживать все языки, которые поддерживает стандартный TextBox.
Поэтому подход, который мы рассматриваем, состоит в том, чтобы использовать скрытое текстовое поле и направлять ему события клавиатуры и мыши после соответствующего перевода, а также использовать его общедоступные средства доступа для определения расположения символов. Это теоретически позволило бы нам выделить выделенный текст, нарисовать каретку, выполнить правильные действия, когда пользователь нажимает клавишу (включая выбор и удаление текста с помощью клавиатуры.)
Другими словами, текстовая область является прокси скрытого текстового поля.
В результате мы используем функциональность текстового поля, преодолевая его ограничения, такие как отсутствие масштабирования и т. Д.
Мы ожидаем, что часть экрана выполнима, но ввод с клавиатуры и мыши, вероятно, очень сложен.
Вопросы:
Испытывалось ли это раньше с каким-либо успехом? Любой рабочий код будет отличным.
Обновление : быстрый и грязный эксперимент, похоже, указывает на то, что TextBox не учитывает координаты мыши, отправленные в сообщениях мыши, но, кажется, непосредственно читает текущую позицию мыши. Поэтому новый вопрос:
Можно ли привести все события мыши TextBox в терминах прямых действий TextBox таким образом, чтобы это работало на всех языках? Мы предполагаем, что метода проверки попадания GetCharIndexFromPosition вместе с методом выделения текста Select, должно быть достаточно. Это кажется разумным?