Como obter CString Largura (Para Unicode) no MFC?

Eu tenho um aplicativo MFC que é o suporte multi-idioma. Para oferecer suporte a multi-linguagem, desenvolveu uma API que pode calcular a largura de desenho de uma Cadeia de caracteres(CString). Ele funciona perfeitamente para a língua inglesa. Para outros unicode de idiomas como o russo,Hindi,árabe(RTL), etc. não é possível calcular a largura exata de uma Seqüência de caracteres. Aqui abaixo está o código da 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;
 }

Aqui abaixo é o método de chamada: Suponha que eu tenha um ID de seqüência de caracteres com o nome: "SOFTWARE_LICENSE" em *.arquivo resx tendo o texto abaixo:

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> 

O Método De Chamada:

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();

Eu preciso deste texto width para definir o Tamanho dos controles de INTERFACE do usuário, como button, Checkbox, etc para multi-idioma (Todos os controles da INTERFACE do usuário são personalizados).

MyUtil::GetTextRect pode calcular a largura para a língua inglesa. Para outra língua largura calculada não é perfeito, grande ou muito pequeno.

Existe alguma maneira para calcular a precisão do texto de largura para a Seqüência de caracteres Unicode?

+1
2019-09-19 09:37:59
origem
1 respostas

Depois de horas de escavação da Apple documentações, finalmente, encontrei a seguinte solução e que funciona para mim. Espero que ajude alguém no futuro.

[https://developer.apple.com/documentation/uikit/uimodalpresentationstyle/overcurrentcontext][1]

presentViewController.modalPresentationStyle = .overCurrentContext

Além disso, se houver um tabbar, a parte inferior da vista da criança controlador estará sob a ele, se você definir o estilo de apresentação para overCurrentContext. A solução é apresentar o filho do controlador de visualização a partir da janela rootViewController.

sender.view.window?.rootViewController?.present(viewController, animated: true, completion: nil)

Agora, quando o demitir é chamado viewWillAppear não é acionado e que eu possa manter o pai do controlador de visualização de dados e do estado.

+1
2019-09-19 09:52:52

Veja mais perguntas por marcas