Как получить CString Width (для Unicode) в MFC? - PullRequest
2 голосов
/ 19 сентября 2019

У меня есть приложение 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?

1 Ответ

2 голосов
/ 19 сентября 2019

Раньше это работало для меня:

CDC *pDC = CDC::FromHandle(textHDC);
CSize size(pDC->GetTextExtent(text));
// use size.cx, size.cy
...