Я пытаюсь узнать об DirectWrite API, чтобы получить гибкое решение проблемы рендеринга текста из любой культуры и, возможно, использовать его для включения редактирования расширенного текста в приложение с гораздо большим контролем, чем «стандартные» способы. редактирования / отображения текста.
Образец PadWrite выглядит великолепно и демонстрирует, насколько хорошо спроектирован API — это собственный скриншот Microsoft о том, как он должен выглядеть:
Текст примера включает в себя строку, которая начинается «Смешанные сценарии:» В исходном коде весь образец текста определяется одним C ++ wchar_t[]
литерала, и смешанные сценарии отображаются правильно в редакторе кода Visual Studio 2012. Если я копирую и вставляю их в обычный Windows WordPad, они также отображаются правильно. И арабская секция справа налево имеет правильное поведение каретки-навигации в обоих этих редакторах.
Но ничего из этого не работает, когда я на самом деле запускаю образец PadWrite. Вместо этого я вижу это:
Похоже, что он конвертируется в UTF-8, а затем неправильно интерпретируется (что не имеет смысла, потому что все это делается с wchar_t
.)
Я использую Windows 8.1. Что мне нужно сделать, чтобы PadWrite работал так же, как WordPad или Visual Studio 2012? Это несуществующий пример из предварительной версии API, которая так и не была обновлена?
NB. первым предупреждающим знаком было то, что PadWrite даже не компилировался сначала — в файлах EditableLayout.cpp
а также TextEditor.cpp
Я должен был добавить это после #include
заявления:
#undef max
#undef min
Я получил ответ на Форумы MSDN. Проблема в том, что с момента создания образца компилятор Visual C ++ был изменен, так что он больше не может обнаруживать кодировку UTF-8 без присутствия сигнатуры UTF-8, тогда как Visual Studio все еще может. И образец был создан таким образом, чтобы исходные файлы не имели подписи UTF-8.
В результате редактор кода VS правильно отображает символы в исходном файле, но при компиляции исходного кода символы интерпретируются неправильно.
Таким образом, решение заключается в использовании Сохранить как, Сохранить с кодировкой … а затем выбрать Юникод (UTF-8 с подписью).
Для сборки с VS 2013 позвольте Visual Studio преобразовать файлы проекта и решения. В Common.h удалите эти строки:
#if (_MSC_VER >= 1200) // want to use std::min and std::max
#undef min
#undef max
#define min(x,y) _cpp_min(x,y)
#define max(x,y) _cpp_max(x,y)
#endif
Компилятор также будет жаловаться на недоступный код в catch (...)
блок в EditableLayout :: Clear. Просто закомментируйте однострочное тело блока catch. Я думаю, что есть некоторая путаница между исключениями в стиле C ++ и исключениями SEH.