|||
最近在尝试MFC中的D2D支持,用UNICODE还算顺利。不过用多字节编码就不太容易了(虽然在新版Visual Studio中越来越难用到多字节编码了)。
在使用多字节编码的MFC程序中,会遇到这个问题。
CRenderTarget::DrawTextA()内部使用T2CW()将多字节字串转换到UNICODE,然后调用ID2D1HwndRenderTarget.DrawText()绘制:
m_pRenderTarget->DrawText(T2CW(strText), strText.GetLength(), textFormat->m_pTextFormat, &rect,
*pForegroundBrush, options, measuringMode);
问题出在传递进去的字串长度参数上:它用strText.GetLength()代替了wcslen(),而strText是多字节字串,得到的是按字节计的字串总长。这样做的结果是对于全是单字节的纯西文字串结果正确,而对于像中文这样的多字节编码字串,会越过结尾,继续绘制出许多乱码。