我想将文本放在我的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)。我想根据文字大小自动更改。你能帮我解决一下吗?
答案 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);
}