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如果末尾有空格的话,画上去确实显得不太好看。