多种颜色的 C++ DirectX DrawText

C++ DirectX DrawText in multiple colors

我使用ID3DXFont界面来绘制文本,只要完整的字符串是单色就完全符合我的需要。现在我想画一个字符串,但有多种颜色。例如"abc",红色为a,黄色为b,等等。 我知道我可以单独绘制每个字母,每次给 DrawText 一个不同的 Color 参数。唯一的问题是我不知道每个字母后应该偏移多少像素,因为每个字母的宽度都不同。硬编码宽度并不是一个很好的解决方案。

ID3DXFont 界面不允许您在 DrawText 的单次调用中绘制多种颜色。但是,它可以为您提供您希望使用 DT_CALCRECT 标志绘制的任何文本的边界矩形,因此您无需在字体中对特定字形的宽度进行硬编码。这也意味着您可以切换字体的字体 and/or 大小,而无需修改绘图代码或硬编码新宽度。例如:

ID3DXFont* font = ...;
const char* strings[] = { "A", "i", "C" };
D3DCOLOR colors[] = { D3DCOLOR_ARGB(255, 255, 0, 0), D3DCOLOR_ARGB(255, 0, 255, 0), D3DCOLOR_ARGB(255, 0, 0, 255) };
RECT r = { 10,10,0,0}; // starting point
for (int i = 0; i < _countof(strings); ++i)
{
    font->DrawText(NULL, strings[i], -1, &r, DT_CALCRECT, 0);
    font->DrawText(NULL, strings[i], -1, &r, DT_NOCLIP, colors[i]);
    r.left = r.right; // offset for next character.
}

注意:我在你的示例中使用 'i' 而不是 'b',因为它明显表明矩形是正确的,因为 'i'(通常)非常细字形。另请注意,这假设只有一行文本。计算出的矩形还包括高度,所以如果你做的是多行,也可以用计算出的矩形的高度来偏移位置。