Любой способ получить высоту текста, в пикселях, текста в CEditBox? - PullRequest
1 голос
/ 28 июня 2019

У меня есть поле для редактирования, которое содержит текст, иногда много предложений. Поле редактирования находится в нижней части родительского диалога (извините, если я говорю все неправильно, я не совсем понимаю, что я делаю, когда дело доходит до приложений MFC). Когда на экран выводится диалоговое окно, которое содержит в себе мое поле редактирования, оно не достаточно высокое и обрезает часть моего поля редактирования внизу. Я надеялся, что смогу вычислить высоту текста, который используется в окне редактирования, и добавить несколько кратных этого значения в функцию, которая определяет высоту родительского диалога, для согласованности.

Я не уверен, имеет ли это смысл, но в конечном итоге я просто пытаюсь выяснить, возможно ли получить текстовую высоту текста в моем окне редактирования. Я не уверен, что мое исправление даже возможно, учитывая, что поле редактирования создано в совершенно другом файле в проекте, но я подумал, что стоит спросить.

1 Ответ

1 голос
/ 30 июня 2019

Вы можете рассчитать необходимую высоту текста, используя следующую базовую формулу:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...