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?
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.