Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何在MFC中获取CString宽度(对于Unicode)?_Windows_Winapi_Unicode_Mfc_Drawtext - Fatal编程技术网

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

Windows 如何在MFC中获取CString宽度(对于Unicode)?,windows,winapi,unicode,mfc,drawtext,Windows,Winapi,Unicode,Mfc,Drawtext,我有一个MFC应用程序,它支持多种语言。为了支持多语言,我开发了一个API,可以计算字符串的绘图宽度(CString)。它只适用于英语。对于其他unicode语言,如俄语、印地语、阿拉伯语(RTL)等,它无法计算字符串的精确宽度。以下是API代码: CRect MyUtil::GetTextRect(LPCTSTR str, CRect* rect, UINT format, MyFontClass *textFont /*, BOOL getActualRect*/) { if (st

我有一个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;
 }
我需要此文本宽度来设置多语言的UI控件(如按钮、复选框等)的大小(所有UI控件都是自定义的)

MyUtil::getExtract只能计算英语语言的宽度。对于其他语言,计算的宽度不是完美的,要么太大,要么太小


有没有办法计算Unicode字符串的准确文本宽度

这曾经对我有用:

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

+我应该为此使用API,但快速看一眼,它似乎只调用@RonTLV MyUtil::getExtract(…)、pDC->GetTextExtent(text)和GetTextExtentPoint32(textHDC、strSL、strSL.GetLength()、&retSize)返回与俄语相同的小值。在RonTLV的回答中,有一些API可能更准确。我也会尝试为你自己的窗口而不是屏幕设置DC,以防有什么不同,但我想不出会是什么。我假设字体是正确的,你的Segoe UI副本有你想要测量的所有字符?@Rup,实际上我不确定“Segoe UI”是否支持/打印其他语言,如俄语、印地语或阿拉伯语。是否有任何特定字体可以支持所有语言?Windows API在内部使用Unicode,它们为Unicode字符串返回准确的结果。GDI函数使用字体替换,并且在通用语言方面没有问题(除非是较旧的Windows XP,我不确定…)。你的代码太长了。只需尝试这两行代码即可获得可重复的结果:
dc.DrawText(string,&rect,format | DT_CALCRECT);DrawText(字符串和矩形,格式)确保
DT_单线
为set@BarmakShemirani我必须确保特定的字体,如字体名称、大小等。只需调用“dc.DrawText(…)”是否可以确保特定的字体?您的程序是否编译为Unicode?还是使用不同语言的ANSI代码页?你能运行这个代码吗?
::MessageBox(0,L“0,0,0)
?如果不是Unicode,那么就不能使用Unicode字符串。如果你的程序是ANSI,那么你得到的错误是预期的。
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();
CDC *pDC = CDC::FromHandle(textHDC);
CSize size(pDC->GetTextExtent(text));
// use size.cx, size.cy