Я пытаюсь реализовать пользовательский виджет в 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
Или нажмите здесь, чтобы загрузить код в виде tarball:
https://gist.github.com/gists/cf3219eb47e2bfe85b38/download
Просто беги make
очистить, скомпилировать и запустить код сразу. Конечно, для компиляции вам понадобится установить wxWidgets 2.8.12.
В основном, все остальные аспекты этого виджета работают именно так, как я хочу — только одна очень большая проблема не позволяет этому работать. Есть, однако, одна крошечная ошибка, которая мне интересна, и, хотя это не главная проблема, я бы хотел ее исправить.
Пробел будет автоматически обрабатываться даже после удаления символов, даже если вы удаляете выделение, однако, если удаляемое выделение заканчивается на девятой цифре, оно не будет переформатировать содержимое элемента управления после удаления.
Если кто-то может определить причину этого, это будет оценено, но проблема точки вставки, очевидно, является моей главной заботой.
Спасибо всем, кто хотел помочь, я постарался предоставить как можно больше информации и объяснений — если я что-то пропустил, пожалуйста, дайте мне знать.
Вообще говоря, трудно изменить обработку ввода собственного элемента управления, поскольку он ведет себя по-разному на разных платформах. Я не знаю, тестировали ли вы свой код под всеми (или хотя бы более чем одним) из них, но я полностью ожидаю, что вы обнаружите больше проблем.
Вместо того, чтобы пытаться сделать это самостоятельно, я бы порекомендовал вам посмотреть на wxMaskedEdit
Предложено добавить в сам wxWidgets. Это еще не окончательно, но есть предварительная версия уже, и я думаю, что он может работать и с 2.8 (хотя, конечно, он разработан с 2.9).
Других решений пока нет …