Вы можете рассчитать необходимую высоту текста, используя следующую базовую формулу:
CEdit::GetLineCount() * TEXTMETRIC::tmHeight
Если элемент управления редактирования имеет какой-либо из стилей WS_BORDER
или WS_HSCROLL
, необходимо учитывать разрыв между размером окна и размером содержимого, который можно рассчитать, взяв разницу между высотами прямоугольников, возвращаемых CEdit::GetWindowRect()
и CEdit::GetRect()
(спасибо, Бармак!).
Ниже приведена функция для расчета «идеального» размера элемента управления для редактирования. Возвращенная высота - это необходимая высота окна, чтобы соответствовать содержимому Возвращенная ширина равна исходной ширине окна. Вы можете использовать параметры minLines
и maxLines
, чтобы убедиться, что возвращаемая высота такова, что элемент управления редактирования показывает по крайней мере minLines
и при максимальном maxLines
количестве строк без прокрутки. Оставьте их по умолчанию, чтобы не ограничивать высоту.
CSize GetEditIdealSize( CEdit& edit, unsigned minLines = 0, unsigned maxLines = 0 )
{
if( CFont* pFont = edit.GetFont() )
{
// Get font information.
CClientDC dc( &edit );
auto const pOldFont = dc.SelectObject( pFont );
TEXTMETRICW tm{}; dc.GetTextMetricsW( &tm );
if( pOldFont )
dc.SelectObject( pOldFont );
// Calculate required height for the text content.
int const heightRequired = edit.GetLineCount() * tm.tmHeight;
// Make sure the edit control height stays between the given minimum/maximum.
int idealHeight = std::max<int>( heightRequired, tm.tmHeight * minLines );
if( maxLines > 0 )
idealHeight = std::min<int>( idealHeight, tm.tmHeight * maxLines );
// Get window and content rect.
CRect rcEdit; edit.GetWindowRect( rcEdit );
CRect rcContent; edit.GetRect( rcContent );
// Account for gap between window rect and content rect.
idealHeight += rcEdit.Height() - rcContent.Height();
return { rcEdit.Width(), idealHeight };
}
return {};
}
Используйте его следующим образом в функции-члене родительского окна элемента управления для изменения размера элемента управления для изменения его содержимого:
CSize const idealSize = GetEditIdealSize( m_edit );
m_edit.SetWindowPos( nullptr, 0, 0, idealSize.cx, idealSize.cy, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE );
Этот код был протестирован под Windows 10 для элемента управления редактирования в стиле ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_BORDER | WS_VISIBLE | WS_CHILD
.