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

时间:2015-06-25 14:36:08

标签: c++ mfc

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

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)。我想根据文字大小自动更改。你能帮我解决一下吗?

1 个答案:

答案 0 :(得分:2)

更新

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

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应该被声明为成员数据和设置设置一次,并在其他地方创建和清理。它认为你正在做的事情。

然后您可以绘制文本函数以查找文本大小,并按如下方式调整控件的大小

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