У меня есть приложение MFC, которое поддерживает несколько языков.Для поддержки мультиязычности я разработал API, который может рассчитывать ширину рисования строки (CString).Он отлично работает только для английского языка.Для других языков Unicode, таких как русский, хинди, арабский (RTL) и т. Д., Он не может вычислить точную ширину строки.Ниже приведен код API:
CRect MyUtil::GetTextRect(LPCTSTR str, CRect* rect, UINT format, MyFontClass *textFont /*, BOOL getActualRect*/)
{
if (str == NULL || _tcslen(str) == 0 || rect == NULL || rect->Width() <= 0 || rect->Height() <= 0 || textFont == NULL)
return CRect(0, 0, 0, 0);
CFont *font = textFont->GetCFont();
HDC textHDC = ::GetDC(NULL);
if (textHDC == NULL)
return CRect(0, 0, 0, 0);
HFONT hfont = (HFONT)(font->GetSafeHandle());
HFONT hOldFont = (HFONT)::SelectObject(textHDC, hfont);
CRect textRect(rect->left, rect->top, rect->Width(), rect->Height());
int result = ::DrawText(textHDC, str, -1, &textRect, format | DT_CALCRECT);
::SelectObject(textHDC, hOldFont);
::ReleaseDC(NULL, textHDC);
CRect retRect(textRect.left, textRect.top, textRect.Width() + 1, textRect.Height() + 1);
//if(getActualRect == FALSE)
//{
// retRect.SetRect(retRect.left, retRect.top
// , retRect.Width() / textFont->GetDPIEnlargeRate(), retRect.Height() / textFont->GetDPIEnlargeRate());
//}
return result == 0 ? CRect(0, 0, 0, 0) : retRect;
}
Ниже приведен метод вызова: Предположим, у меня есть идентификатор строки с именем: "SOFTWARE_LICENSE" in * .resxфайл с текстом ниже:
Text for English:
<data name="SOFTWARE_LICENSE" xml:space="preserve">
<value>Software Licence</value>
</data>
Text for Russian:
<data name="SOFTWARE_LICENSE" xml:space="preserve">
<value>Лицензия программного обеспечения</value>
</data>
Метод вызова:
CString strSL = AfxGetStrRes(_T("SOFTWARE_LICENSE"));
MyFontClass txtFont14Regular = MyFontTemplate::CreateFont(_T("Segoe UI"), -14, FW_NORMAL);
int textWidth = MyUtil::GetTextRect(strSL, &CRect(0, 0, 1000, 1000), DT_LEFT | DT_VCENTER | DT_SINGLELINE,txtFont14Regular).Width();
Мне нужна эта ширина текста, чтобы установить размер таких элементов управления, как кнопка, флажок и т. д.для мультиязычного (все элементы управления пользовательского интерфейса настроены) .
MyUtil :: GetTextRect может рассчитать ширину только для английского языка.Для других языков рассчитанная ширина не является идеальной, большой или слишком маленький.
Есть ли способ рассчитать точную ширину текста для строки Unicode?