Как я могу получить образец DirectWrite PadWrite для работы?

Я пытаюсь узнать об DirectWrite API, чтобы получить гибкое решение проблемы рендеринга текста из любой культуры и потенциально использовать его для включения редактирования расширенного текста в приложение с гораздо большим контролем, чем "стандартные" способы. редактирования / отображения текста.

Образец PadWrite выглядит великолепно и демонстрирует, насколько хорошо разработан API - это собственный скриншот Microsoft о том, как он должен выглядеть:

Снимок экрана PadWrite

Текст примера включает в себя строку, которая начинается "Смешанные сценарии:" В исходном коде весь образец текста определяется одним 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

2 ответа

Решение

Я получил ответ на форумах MSDN. Проблема в том, что с момента создания образца компилятор Visual C++ был изменен, так что он больше не может обнаруживать кодировку UTF-8 без присутствия сигнатуры UTF-8, тогда как Visual Studio все еще может. И образец был создан таким образом, что исходные файлы не имеют подписи UTF-8.

В результате редактор кода VS правильно отображает символы в исходном файле, но при компиляции исходного кода символы интерпретируются неправильно.

Поэтому решение состоит в том, чтобы использовать " Сохранить как", " Сохранить с кодировкой...", а затем выбрать Unicode (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.

Другие вопросы по тегам