mfc中如何自动调整文本控件的大小

How to auto resize the text control in mfc

我想将文本放入 MFC 中的 IDC_TEXT。我想使用输入文本自动调整该控件的大小。我使用了我的代码,但它不起作用。你能帮我解决一下吗?

CFont *m_Font1 = new CFont;
CStatic * m_Label;
m_Font1->CreatePointFont(200, "Time New Roman");
m_Label = (CStatic *)GetDlgItem(IDC_TEXT);
m_Label->SetFont(m_Font1);
m_Label->SetWindowText( _T("") );
//Display text in thread
THREADSTRUCT*    ts = (THREADSTRUCT*)param;
CDC* vDC_TXT;
vDC_TXT =ts->_this->GetDlgItem(IDC_TEXT)->GetDC();
ts->_this->GetDlgItem(IDC_TEXT)->SetWindowTextA(text.c_str());
 //Update the length-
 ts->_this->GetDlgItem(IDC_TEXT)->SetWindowPos(NULL, 0, 0, 1000, 1000, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);

然而,数字(1000,1000)是我手定的。我想根据文本大小自动更改。可以让我解决吗?

更新:

如果字体大小相同,只有文本不同,那么您应该可以重新使用旧字体:

void ChangeSize()
{
    CWnd* dlgItem = GetDlgItem(IDC_STATIC1);

    if (!dlgItem)
        return;

    CString s;
    dlgItem->GetWindowText(s);

    CDC dc;
    dc.CreateCompatibleDC(NULL);
    dc.SelectObject(dlgItem->GetFont());

    CRect r;
    dlgItem->GetClientRect(&r);

    if (s.Find('\n') < 0)
        dc.DrawText(s, &r, DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE | DT_EDITCONTROL);
    else
        dc.DrawText(s, &r, DT_CALCRECT | DT_NOPREFIX | DT_EDITCONTROL);

    dlgItem->SetWindowPos(0, 0, 0, r.Width(), r.Height(), SWP_NOMOVE);
}

上一个关于何时更改字体的答案:

m_Font1应该声明为成员数据和setup setup一次,在别处创建和清理。它认为这就是你在做的事情。

然后可以绘制文字函数求文字大小,调整控件大小如下

void ChangeSize()
{
    CWnd* dlgItem = GetDlgItem(IDC_STATIC1);

    if (!dlgItem)
        return;

    CString s;
    dlgItem->GetWindowText(s);

    CDC dc;
    dc.CreateCompatibleDC(NULL);
    //or just use CClientDC dc(this) if device context is available

    dc.SelectObject(m_font);

    CRect r;
    dlgItem->GetClientRect(&r);

    if (s.Find('\n') < 0)
    {
        //change width/height for single line text
        dc.DrawText(s, &r, DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE | DT_EDITCONTROL);
    }
    else
    {
        //change height for multiple-line text
        dc.DrawText(s, &r, DT_CALCRECT | DT_NOPREFIX | DT_EDITCONTROL);
    }

    dlgItem->SetWindowPos(0, 0, 0, r.Width(), r.Height(), SWP_NOMOVE);
    dlgItem->SetFont(m_font, 1);
}