Создание безоконной масштабируемой текстовой области, которая проксирует настоящее текстовое поле Winforms в C # - PullRequest
4 голосов
/ 03 сентября 2010

Важно: нам действительно нужна заявленная функциональность, поэтому, пожалуйста, не начинайте предлагать альтернативы.

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

Мы должны иметь возможность отображать текст и курсор на пользовательском элементе управления при различных уровнях масштабирования и с использованием других пользовательских эффектов. Однако мы не хотим (или не располагаем необходимыми средствами) писать код метода ввода с клавиатуры и мыши, код служб строки и т. Д. - решение должно поддерживать все языки, которые поддерживает стандартный TextBox.

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

Другими словами, текстовая область является прокси скрытого текстового поля. В результате мы используем функциональность текстового поля, преодолевая его ограничения, такие как отсутствие масштабирования и т. Д.

Мы ожидаем, что часть экрана выполнима, но ввод с клавиатуры и мыши, вероятно, очень сложен.

Вопросы: Испытывалось ли это раньше с каким-либо успехом? Любой рабочий код будет отличным.

Обновление : быстрый и грязный эксперимент, похоже, указывает на то, что TextBox не учитывает координаты мыши, отправленные в сообщениях мыши, но, кажется, непосредственно читает текущую позицию мыши. Поэтому новый вопрос:

Можно ли привести все события мыши TextBox в терминах прямых действий TextBox таким образом, чтобы это работало на всех языках? Мы предполагаем, что метода проверки попадания GetCharIndexFromPosition вместе с методом выделения текста Select, должно быть достаточно. Это кажется разумным?

1 Ответ

1 голос
/ 03 сентября 2010

Я бы порекомендовал вам использовать скрытый TextBox, как вы предлагаете, а затем отправлять ему сообщения WM_PRINT для того, чтобы его содержимое было отображено на растровое изображение.Затем вы можете нарисовать это растровое изображение в реальной области интереса и при этом применить изменения, такие как масштабирование или поворот и так далее.Любые сообщения от клавиатуры могут быть просто перенаправлены в скрытый TextBox, поэтому курсор и содержимое будут обновляться в соответствии с ожиданиями пользователя.Сложная часть - это просто управление мышью.Вам нужно взять клиентскую координату, а затем использовать обратное преобразование (масштабирование, вращение и т. Д.), Чтобы перейти от клиента к действительным координатам скрытого текстового поля.

...