gpt4 book ai didi

windows - 如何在 MFC 中获取 CString 宽度(对于 Unicode)?

转载 作者:可可西里 更新时间:2023-11-01 10:10:40 26 4
gpt4 key购买 nike

我有一个支持多语言的 MFC 应用程序。为了支持多语言,我开发了一个可以计算 String(CString) 绘图宽度的 API。它仅适用于英语。对于其他 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;
}

调用方法如下:假设我在 *.resx 文件中有一个名为 "SOFTWARE_LICENSE" 的字符串 ID,其文本如下:

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

我需要这个文本宽度来设置 UI 控件的大小,例如多语言的按钮、复选框等(所有 UI 控件都是自定义的)

MyUtil::GetTextRect 只能计算英文的宽度。对于其他语言,计算出的宽度并不完美,不是大就是太小。

有什么方法可以计算出 Unicode 字符串的准确文本宽度?

最佳答案

这曾经对我有用:

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

关于windows - 如何在 MFC 中获取 CString 宽度(对于 Unicode)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com