1

我正在尝试了解 DirectWrite API,这样我就可以获得一个灵活的解决方案来解决从任何文化中呈现文本的问题,并可能使用它将富文本编辑合并到应用程序中,并且比“固定”方式具有更多的控制权编辑/显示文本。

PadWrite示例看起来很棒,并展示了 API 的精心设计——这是 Microsoft 自己的屏幕截图:

PadWrite 截图

示例文本包括以“混合脚本”开头的行:在源代码中,所有示例文本都由单个 C++wchar_t[]文字指定,并且混合脚本都在 Visual Studio 2012 的代码编辑器中正确显示。如果我将它们复制并粘贴到普通的 Windows 写字板中,它们也会正确显示。并且阿拉伯语从右到左部分在这两个编辑器中都有正确的插入符号导航行为。

但是当我实际运行 PadWrite 示例时,这些都不起作用。相反,我看到了这个:

在此处输入图像描述

它几乎看起来像是被转换为 UTF-8 然后被误解了(这没有意义,因为这一切都是用 . 完成的wchar_t。)

我正在运行 Windows 8.1。我需要做什么才能使 PadWrite 与 WordPad 或 Visual Studio 2012 一样好用?它是来自从未更新过的 API 预发布版本的失效样本吗?

注意。第一个警告信号是 PadWrite 一开始甚至没有编译 - 在文件中EditableLayout.cppTextEditor.cpp我不得不在#include语句之后添加:

#undef max
#undef min
4

2 回答 2

2

我在MSDN 论坛上得到了答案。问题在于,自从创建示例以来,Visual C++ 编译器已更改,因此它不再能够在不存在 UTF-8 签名的情况下检测 UTF-8 编码,而 Visual Studio 仍然可以。并且创建了示例,因此源文件没有 UTF-8 签名。

结果,VS 的代码编辑器在源文件中正确显示字符,但是在编译源文件时字符被误解。

所以解决方案是使用Save as , Save with Encoding...然后选择Unicode (UTF-8 with signature)

于 2013-12-13T13:59:24.790 回答
0

要使用 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 异常之间存在一些混淆。

于 2014-02-09T02:14:27.523 回答