Каков правильный современный способ обработки произвольного ввода текста в пользовательском элементе управления в Windows? WM_CHAR? IMM? TSF?
Я хочу иметь возможность поддерживать ввод текста в пользовательском элементе управления Windows, точно так же, как уже сделали EDIT и элементы управления rich edit, но не разделять их на подклассы. Элемент управления в настоящее время использует Direct2D и DirectWrite для рисования текста и работает в Windows Vista с пакетом обновления 1 (SP1) с обновлением платформы или более поздней версии (я мог бы изменить его на Windows 7 с пакетом обновления 1 (SP1) с обновлением платформы или более поздней версии, если решу, что мне нужны более новые функции Direct2D и DirectWrite, если они доступно там или только на Windows 8, но это другой вопрос ...)
Для чего это стоит, на OS X я бы использовалNSTextInputClient а на GTK + я бы использовалGtkIMContext, Это такие вещи, о которых я говорю.
Очевидный выбор - использоватьWM_CHAR
, который, если я правильно понял, изначально UTF-16, если класс окна зарегистрирован сRegisterClassW()
и поэтому должен «просто работать» независимо от местоположения. Тем не мение,WM_CHAR
генерируетсяTranslateMessage()
, а такжеего документация говорит, что нет способа определить, является лиWM_CHAR
был создан или нет, так какTranslateMessage()
всегда возвращает ненулевое значение. Мне нужно иметь возможность определить, будет ли текущее сообщение клавиатуры обрабатываться текстовой системой (и, следовательно, должно игнорироваться); это особенно верно, поскольку все нетекстовые ключи должны обрабатываться независимо от макета (что у меня уже есть).
Я также видел в примерах кода Windows 7 для API IMM и Text Services Framework. Я не уверен, что один лучше другого, и они оба, кажется, делают то же самое. Они?
В случае с IMM существует рядWM_IMM_xxx
сообщения, которые я не уверен, должен ли я игнорировать или нет, и каждая найденная мной ссылка, кажется, не согласна с тем, должен ли я обрабатывать их в окне Unicode или нет ... Кроме того, вышеупомянутая проблема с определением, является ли данное ключевое событие будет обработано IMM или еще не открыто; есть ли способ?
У TSF есть концепция, называемая ACP, которая, кажется, позволяет мне использовать любой формат хранения текста, который я хочу для хранения текста, который я собираюсь использовать (т. Е. Не в процессе разработки). Это правда? Я хотел бы иметь возможность хранить свой текст как UTF-8 с атрибутами, преобразовывая в UTF-16 при рисовании (для DirectWrite). Позволяют ли мне делать другие варианты API?
Или я совершенно не на том пути?
И как бы явыбирать в на экранной клавиатуре когда я все это сделаю?
Другие ссылки, которые я использовал:
http://www.catch22.net/tuts/unicode-text-editingБлагодарю.
ОБНОВИТЬ 7 ноября 2016
Посмотрев на образец TsfPad снова, я заметил, что он также, кажется, просто используетWM_CHAR
; теперь я не уверен, как он вообще использует TSF, кроме того, что он делает ...