首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

d3d里,用DrawText()的DT_CALCRECT标识获取字体像素大小的有关问题。

2012-02-05 
d3d里,用DrawText()的DT_CALCRECT标识获取字体像素大小的问题。。。我用m_pD3DXFont-DrawText(NULL, pText,

d3d里,用DrawText()的DT_CALCRECT标识获取字体像素大小的问题。。。
我用m_pD3DXFont->DrawText(NULL, pText, -1, &rect, DT_CALCRECT, 0xffffffff);
来获取字体的宽和高。

结果,得出以下几个情况:
1:当pText==" "时(1个空格),宽为1个空格的大小
2:当pText==" "时(双引号内有很多空格,这里论坛显示有问题),宽仍为1个空格的大小
3:当pText=="abc "时(末尾有些空格),宽为"abc"的大小
4:当pText=="abc ef"时,宽为"abc ef"的大小

为什么只要pTest的末尾几个字符是空格,就得不到正常的宽度值???
有人知道什么问题么?

[解决办法]
D3DXFont以及GDI以及GDI+ font在测量“空格”的时候都无法获得准确的值,因为这些系统都把“空格”当成是一个排版控制符而不是一个字符,所以这种情况下需要自己寻找其它的途径解决,比如不使用D3DXFont然后自己做一个类似的系统等等,当然这么做的工作量还是很大的。

DX SDK自带的DXUT里面,为了解决这个问题,使用了一些未公开的函数,你可以参照着做一下:

HINSTANCE CUniBuffer::s_hDll = NULL;
HRESULT ( WINAPI*CUniBuffer::_ScriptApplyDigitSubstitution )( const SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*,
SCRIPT_STATE* ) = Dummy_ScriptApplyDigitSubstitution;
HRESULT ( WINAPI*CUniBuffer::_ScriptStringAnalyse )( HDC, const void*, int, int, int, DWORD, int, SCRIPT_CONTROL*,
SCRIPT_STATE*, const int*, SCRIPT_TABDEF*, const BYTE*,
SCRIPT_STRING_ANALYSIS* ) = Dummy_ScriptStringAnalyse;
HRESULT ( WINAPI*CUniBuffer::_ScriptStringCPtoX )( SCRIPT_STRING_ANALYSIS, int, BOOL, int* ) = Dummy_ScriptStringCPtoX;
HRESULT ( WINAPI*CUniBuffer::_ScriptStringXtoCP )( SCRIPT_STRING_ANALYSIS, int, int*, int* ) = Dummy_ScriptStringXtoCP;
HRESULT ( WINAPI*CUniBuffer::_ScriptStringFree )( SCRIPT_STRING_ANALYSIS* ) = Dummy_ScriptStringFree;
const SCRIPT_LOGATTR* ( WINAPI*CUniBuffer::_ScriptString_pLogAttr )( SCRIPT_STRING_ANALYSIS ) =
Dummy_ScriptString_pLogAttr;
const int* ( WINAPI*CUniBuffer::_ScriptString_pcOutChars )( SCRIPT_STRING_ANALYSIS ) =
Dummy_ScriptString_pcOutChars;

[解决办法]
DrawText如果末尾有空格的话,画上去确实显得不太好看。

热点排行