Проблемы с настройкой точки вставки в wxTextCtrl
Я пытаюсь реализовать пользовательский виджет в wxWidgets (версия 2.8.12), по сути, измененную однострочную wxTextCtrl. Требуется ввод текста, который состоит из двух наборов 8-значных шестнадцатеричных чисел, разделенных пробелом, и я хочу, чтобы элемент управления автоматически обрабатывал это пространство. Например, если пользователь вводит 1-8 дважды (нажатие клавиши пробела не требуется), полученное содержимое текстового элемента управления должно быть:
12345678 12345678
Если бы пользователь затем должен был поместить курсор после первых 3 и вернуться три раза назад, это пространство должно автоматически корректироваться при редактировании, что приводит к:
45678123 45678
По сути, пространство должно быть полностью прозрачным для пользователя.
У меня это, по большей части, сделано. Код немного длинный, чтобы вставить его здесь, так что вот Gist:
https://gist.github.com/036c1a90f77521a8653c
Однако есть одна ошибка, которую я не могу исправить: после ввода девятой цифры она автоматически вставляет пробел, но курсор заканчивается сразу после пробела, прямо за девятой цифрой.
Все попытки использовать wxTextCtrl::SetInsertionPoint()
а также wxTextCtrl::SetInsertionPointEnd()
не показали успеха, поэтому я приехал сюда в крайнем случае в надежде, что кто-нибудь укажет, что я делаю неправильно.
Чтобы помочь в тестировании этого виджета, я подготовил очень быстрое и грязное приложение, содержащее виджет:
https://gist.github.com/cf3219eb47e2bfe85b38
Или нажмите здесь, чтобы загрузить код в виде архива:
https://gist.github.com/gists/cf3219eb47e2bfe85b38/download
Просто беги make
очистить, скомпилировать и запустить код сразу. Конечно, для компиляции вам понадобится установить wxWidgets 2.8.12.
В основном все остальные аспекты этого виджета работают именно так, как я хочу, - только эта очень большая проблема не позволяет этому работать. Есть, однако, одна крошечная ошибка, о которой мне любопытно, и хотя это не главная проблема, я бы хотел ее исправить.
Пробел будет автоматически обрабатываться даже после удаления символов, даже если вы удаляете выделение, однако, если удаляемое выделение заканчивается на девятой цифре, оно не будет переформатировать содержимое элемента управления после удаления.
Если кто-то может определить причину этого, это будет оценено, но проблема точки вставки, очевидно, является моей главной заботой.
Спасибо всем, кто хотел помочь, я постарался предоставить как можно больше информации и объяснений - если я что-то пропустил, пожалуйста, дайте мне знать.
1 ответ
Вообще говоря, трудно изменить обработку ввода собственного элемента управления, поскольку он ведет себя по-разному на разных платформах. Я не знаю, тестировали ли вы свой код под всеми (или хотя бы более чем одним) из них, но я полностью ожидаю, что вы обнаружите больше проблем.
Вместо того, чтобы пытаться сделать это самостоятельно, я бы порекомендовал вам посмотреть на wxMaskedEdit
Предлагается для добавления в сам wxWidgets. Это еще не окончательная версия, но уже есть предварительная версия, и я думаю, что она может работать и с 2.8 (хотя, конечно, она разработана с 2.9).