如题,需要动态调整CStatic的大小,使其刚好放得下其内容,请问有没有什么方法可以准确计算出CStatic的大小?比如:CString strContent = "abfjdsalkfjdsafjkdfjjjjjjjjjjddddddddddddddddddsssssssefsfdssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\r\newfffffffffffffffffff";

解决方案 »

  1.   

    先看你的字符串打算占几行,每行占多宽,得到一个面积。然后把CStatic的大小设成对应大小就行了。
    看看孙鑫老师讲的文本编程那一章的卡拉ok例子,可能对你有所帮助。
      

  2.   

    先得到 CStatic 的字体,然后 GetTextMetrics 和 GetTextExtent计算 高度 宽度,然后调整你的CStatic  计算大小记得考虑换行
      

  3.   

    GetTextMetrics  是得到系统的宽度高度等等的参数GetTextExtent 是得到当前字体什么的高度宽度
      

  4.   

    DrawText(hDC, str, strlen, &rc,DT_CALCRECT )
      

  5.   


    我是想让宽度固定,然后求行数啊。
    比如说CStatic控件的right和对话框的right相同,CStatic的内容很多,需要动态调整它的高度,使所有内容都能完成的显示出来,有什么办法?
      

  6.   

    一个字符一个字符的累加
    通过GetTextExtent计算宽度
    如果超过你的限定就换行
    如果遇到换行符也换行
      

  7.   

    用Static根据内容动态调整大小太麻烦了,因为要考虑每一行的长度还有里面的换行,所以改成用CEditBox了。
    写了个函数,直接传字符串进去,CEditBox就能自动调整大小(当然,宽度是要固定的)
    void CdsDlg::SetEditTextAutoLine(CString strText)
    {
    const int iEditShowWidth = 100;             //固定宽度为50(高度根据内容自动调整) CRect rcEditShowString;  
    m_editShowString.GetWindowRect(&rcEditShowString);      //获取edit控件的原始大小
    ScreenToClient(&rcEditShowString); //因edit控件已具有自动换行属性,所以SetWindowText并调整
    //控件宽度后,得到的行数即是editbox内容的准确行数
    m_editShowString.SetWindowText(strText);               
    rcEditShowString.right = rcEditShowString.left + iEditShowWidth;
    m_editShowString.MoveWindow(rcEditShowString);  
    int iLines = m_editShowString.GetLineCount(); //计算当前字体下,一行字符所占高度
    CClientDC dc(this);
    CSize szText = dc.GetTextExtent(strText); int iAllTextHeight = (szText.cy - 3) * iLines;   //所有文字所需的总高度【cy-3:更准确】 rcEditShowString.bottom = rcEditShowString.top + iAllTextHeight; //根据已得到的文字内容的高度调整editbox,使其显示正好容纳下所有字符
    m_editShowString.MoveWindow(rcEditShowString);
    }
      

  8.   

    忘说了,使用上面代码需要先设置CEditBox的属性:
    不显示垂直/水平流动条且Multiline为True