【问题标题】:How to auto resize the text control in mfc如何在 mfc 中自动调整文本控件的大小
【发布时间】:2015-06-25 14:36:08
【问题描述】:

我想将文本放在 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)是我亲手设置的。我想根据文本大小自动更改。可以请我解决吗?

【问题讨论】:

  • “不起作用”不是很有帮助。
  • 表示显示文本,但是当文本长度大于IDC_TEXT时,文本中的其他字符会丢失。在我的情况下,这就是“不起作用”的意思
  • 长镜头(我不使用MFC),这对你有帮助吗:stackoverflow.com/questions/1745693/get-text-width-in-mfc
  • 您不会在任何地方更改控件的宽度,所以这并不奇怪。您需要查看上面列出的链接@JackWhiteIII。
  • 我看到了,但他们有很多解决方案。你能看看我的代码并给我一个好的解决方案

标签: c++ mfc


【解决方案1】:

更新:

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

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

【讨论】:

  • 感谢 Barmak Shemirani。所以,我就在ts->_this->GetDlgItem(IDC_TEXT)->SetWindowTextA(text.c_str());下面调用你的函数,是不是?
  • 其实好像只需要改文字,不需要改字体大小?在这种情况下,您可以只使用GetFont() 而不是创建新字体。我会更新帖子。
  • 对。我只想更改我的文本控件以修复输入文本
  • 不,不要释放或删除该指针。它没有进行任何额外分配。
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2011-02-22
  • 2019-07-05
  • 2020-04-16
  • 2014-09-25
相关资源
最近更新 更多