我使用ID3DXFont界面绘制文本,只要完整的字符串是单色的,就完全符合我的需要。现在我想绘制一个字符串,但是有多种颜色。例如“abc”,红色为b,黄色为b等。
我知道我可以自己绘制每个字母,每次都为Color
提供不同的DrawText
参数。唯一的问题是我不知道每个字母后我应该偏移多少像素,因为每个字母都有不同的宽度。硬编码宽度并不是一个很好的解决方案。
答案 0 :(得分:1)
ID3DXFont
界面不允许您在DrawText
的单个调用中绘制多种颜色。但是,它可以使用DT_CALCRECT
标志为您提供要绘制的任何文本的边界矩形,因此您不需要对字体中特定字形的宽度进行硬编码。这也意味着您可以切换字体的字体和/或大小,而无需修改绘图代码或硬编码新宽度。例如:
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'(通常)是一个非常薄的字形。另请注意,这假定单行文本。计算出的矩形还包括高度,因此如果要进行多行,还可以使用计算矩形的高度来偏移位置。