【问题标题】:Get text width in MFC在 MFC 中获取文本宽度
【发布时间】:2010-12-17 06:30:42
【问题描述】:

我想将 CButton 的大小动态调整为其中文本的宽度。是否有在 MFC 中执行此操作的内置方法,或计算某些指定文本的像素宽度的方法(以便我可以使用 CWnd::SetWindowPos)?

【问题讨论】:

    标签: c++ visual-c++ mfc


    【解决方案1】:

    这很乏味。您需要在按钮上使用CWnd::GetFont() 来获取它正在使用的字体,然后在您将选择该字体的CDC 对象上使用标准GetTextText。 它看起来像

    CClientDC dc( &button );
    CFont * pOldFont = dc.SelectObject( button.GetFont() );
     ... dc.GetTextExtent...
    dc.SelectObject( pOldFont);
    

    【讨论】:

      【解决方案2】:

      您可以使用CDC::GetTextExtent 计算某种字体的文字宽度。使用CWnd::GetDC 从显示文本的控件中获取设备上下文。

      【讨论】:

        【解决方案3】:

        除了@demoncodemonkey 的回答,您还可以使用DT_CALCRECT 标志调用CDC::DrawText。这样文本不会被绘制,但是您传递给函数的 CRect 将具有要绘制的文本的宽度和高度。

        如果您想绘制带有换行符的文本(使用DT_WORDBREAK 标志),这将特别有用。使用CDC::GetTextExtent 将无法做到这一点。

        【讨论】:

        • GetTextExtentDrawText 之间是否存在性能差异?
        • 考虑到DrawText 在实际绘制之前必须进行测量和布置文本,而GetTextExtent 只做前者,如果有的话我不会感到惊讶,是的。不过,还没有任何经验数据来支持这一点。
        【解决方案4】:
        CClientDC hdc(this);
        GetRect.SetRect(0,0,iLabelWidth,0);
        //
        //To get Height of Lable in advance
        //
        hdc.DrawText(
                        TempData,
                        TempData.GetLength(),
                        GetRect,
                        DT_CALCRECT | DT_MODIFYSTRING | DT_WORDBREAK 
                    );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-10
          • 1970-01-01
          • 2014-02-16
          • 1970-01-01
          • 2010-12-10
          • 2012-08-11
          • 2019-01-23
          • 2021-03-24
          相关资源
          最近更新 更多