有什么方法可以检索CEditBox中文本的文本高度(以像素为单位)?

时间:2019-06-28 16:16:12

标签: c++ mfc

我有一个包含文本的编辑框,有时很多句子长。编辑框位于其父对话框的底部(如果我说错了,请原谅我,我不太了解MFC应用程序在做什么)。当将包含我的编辑框的对话框绘制到屏幕上时,它的绘制高度还不够高,并且会在底部切掉我的编辑框的一部分。我希望能够计算出在编辑框中使用的文本的高度,并为确定父对话框的高度而向该函数添加该值的几倍,以保持一致性。

我不确定这是否有意义,但最终我只是试图找出是否有可能在我的编辑框中获取文本的文本高度。鉴于编辑框是在项目中完全不同的文件中创建的,所以我不确定是否可以解决此问题,但是我认为可能值得提出。

1 个答案:

答案 0 :(得分:1)

您可以使用以下基本公式计算所需的文字高度:

CEdit::GetLineCount() * TEXTMETRIC::tmHeight

如果编辑控件具有WS_BORDERWS_HSCROLL样式中的任何一种,则必须考虑窗口大小与内容大小之间的差距,该差距可以通过计算返回的矩形的高度之间的差来计算CEdit::GetWindowRect()CEdit::GetRect()的作者(感谢Barmak!)。

以下是计算编辑控件的“理想”大小的函数。返回的高度是适合内容的所需窗口高度。返回的宽度等于原始窗口的宽度。您可以使用参数minLinesmaxLines来确保返回的高度使得编辑控件至少显示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的编辑控件。