Кусочное преобразование приложения MFC в Unicode / MBCS - PullRequest
5 голосов
/ 24 августа 2009

У меня большое приложение MFC, которое я расширяю для многоязычного ввода. На данный момент мне нужно разрешить пользователю вводить данные Unicode в поля редактирования в одном диалоговом окне.

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


Уточнение: я мог бы использовать :: GetWindowTextW (), чтобы получить информацию о Юникоде из окна. Я пытаюсь выяснить, как разрешить пользователю вводить текст Unicode в окне. В настоящее время символов, которые пользователь вводит вне кодовой страницы windows-1252, отображаются как '?'. Есть ли способ это исправить?

Ответы [ 4 ]

4 голосов
/ 24 августа 2009

Чтобы разрешить CEdit показывать символы Юникода, вы должны создать его с помощью функции CreateWindowW. Я только что проверил это в программе ANSI MFC.

// allows Unicode characters
CreateWindowW( L"EDIT", L"", WS_CHILD|WS_VISIBLE, 10, 10, 50, 20, GetSafeHwnd(), 0, 0, 0 );

// shows Unicode characters as ?
CreateWindow( "EDIT", "", WS_CHILD|WS_VISIBLE, 10, 10, 50, 20, GetSafeHwnd(), 0, 0, 0 );

Вы можете создать все поля редактирования вручную в функции OnInitDialog диалогового окна. И позже подкласс их для пользовательского класса CMyEdit с поддержкой Unicode.

2 голосов
/ 24 августа 2009

Можете ли вы заменить эти поля редактирования расширенными элементами управления? Тогда вы можете вводить международные символы даже в сборке не-Unicode; внутри они будут кодироваться в формате rtf, но затем, когда вы выводите текст из элемента управления, вы можете использовать формат SF_UNICODE для получения представления Unicode.

1 голос
/ 24 августа 2009

Это слайд-шоу в PowerPoint может вас заинтересовать - оно немного старое (2000), но в нем говорится о преобразовании программы в смешанный ANSI / Unicode.

Пример: перенос приложения MFC на Unicode

0 голосов
/ 24 августа 2009

Просто мысль - вы можете попробовать включить UNICODE для вашей сборки и использовать вызовы ANSI там, где вам нужно (например, CStringA).

( Я понимаю, что это может быть не вариант для вас, но подумал, что стоит указать, что вы можете решить эту проблему наоборот )

...