一段文本是变化的,当显示的长度超过边界就自动转到下一行显示
用CStatic不能既垂直居中,又自动换行
我的解决方法是用CButton代替CStatic,因为CButton的属性设置一下就可以达到效果,但是怎么让CButton的边框颜色都去掉???CButton重绘的话字体又不能自动换行了

解决方案 »

  1.   

    DrawText函数有DT_WORDBREAK属性,可以实现换行
      

  2.   

    CString 加 \n好像也可以吧,在属性里面设置垂直居中,然后再要换行的文本后面加 \n就可以啊。
    重绘的时候在要换行的地方文本后面加 \n不成么?
      

  3.   

    不好意思打错了,是CStatic 不是CString
      

  4.   

    您是做什么用的,这个变化的字串是怎样得到的?
    GDI+的DrawString可以考虑一下。它要求给定一个框然后在框里画字,到框的边缘自动换行。
      

  5.   

    只需要派生一个CButton,重载DrawItemvoid CSkinButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    // TODO: Add your code to draw the specified item
    CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rcClient;
    GetClientRect( &rcClient ); CString sText;
    GetWindowText( sText ); pDC->DrawText( sText,rcClient, DT_CENTER|DT_WORDBREAK );
    }
    注意要把Button的属性加上own draw
      

  6.   

    这样就不能垂直居中了,pDC->DrawText( sText,rcClient, DT_LEFT|DT_WORDBREAK|DT_VCENTER ); 
      

  7.   

    我没有DT_VCENTER也是垂直居中的,你试试吧,这就是button和static的区别
    vc6 xp 下通过
      

  8.   

    用CEdit等控件...不要边框,然后背景一致
      

  9.   

    用GetTextExtentExPoint得到输出文字的高度,再结合控件高度计算出居中显示的纵坐标,然后输出。
    另外,用DrawText也可以得到输出文字的高度。
      

  10.   

    void CStaButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
     CRect rect =  lpDrawItemStruct->rcItem;
     CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
     int nSaveDC=pDC->SaveDC();
     UINT state = lpDrawItemStruct->itemState;
     //POINT pt ;
     TCHAR strText[MAX_PATH + 1];
     ::GetWindowText(m_hWnd, strText, MAX_PATH);
     
     //显示按钮的文本
     if (strText!=NULL)
     { // CFont* hFont = GetFont();
     CFont* hFont=new CFont;
    hFont->CreateFont(23,0,0,0,
     FW_DONTCARE,
      0,
      0,
     0,
      DEFAULT_CHARSET,
    OUT_DEFAULT_PRECIS,                                   
       CLIP_DEFAULT_PRECIS,
       DEFAULT_QUALITY,                                  
    DEFAULT_PITCH|FF_SWISS,        
      _T("宋体"));     CRect rect2;
    GetWindowRect(&rect2);
    GetParent()->ScreenToClient(rect2);
      CFont* hOldFont = pDC->SelectObject(hFont);
      delete hFont;
      CSize szExtent;
      if(!GetTextExtentPoint(pDC->m_hDC,strText,strlen(strText),&szExtent))
      ASSERT(0);
      //CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
      CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);TRACE("strText=%s,szExtent.cx,cy=%d,%d\n",strText,szExtent.cx,szExtent.cy);
      if(szExtent.cx<749)//761)
      {
     pDC->DrawText(strText,rect,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
     TRACE("DT_VCENTER!!\n");
      }
      else if(szExtent.cx<1498)
      {
     // CString strss;
    //  strss.Format("szExtent.cx=%d",szExtent.cx);
      rect.top+=30;
     pDC->DrawText(strText,rect,DT_WORDBREAK|DT_LEFT);
     TRACE("DT_WORDBREAK!\n");
      }
      else
      {   rect.top+=16;
     pDC->DrawText(strText,rect,DT_WORDBREAK|DT_LEFT);
     TRACE("DT_WORDBREAK!\n");  }
      pDC->SelectObject(hOldFont); } 
     pDC->RestoreDC(nSaveDC);
    }
    谢谢大家,我按照cnzdgs说的做,判断文本的长度,超过某一值就设置换行,否则就垂直居中显示,可以达到效果,谢谢大家