在对话框资源画好静态文本控件后,有时显示的文本长度比静态文本控长。这时候没法显示完?求助如题!

解决方案 »

  1.   

    得到文字的宽度,然后MoveWindow,或者SetWindowPos
      

  2.   

    做成静态文本控件的尺寸根据文本的内容自动调整大小
    使用一下函数既能解决问题
      函数功能:该函数计算指定的正文字符串的高度和宽度。 
       函数原型:BOOL GetTextExtentPoint32(HDC hdc, LPCTSTR lpString, int cbString, LPSIZE lpSize); 
       参      数:hdc:设备环境句柄。 
                   lpString:指向正文字符串的指针。此字符串不必以\0结束,因为cbString指定了字符串的长度。 
                   cbString:指向字符串中的字符数。 
                   lpSize:指向SIZE结构的指针,该结构中字符串的尺寸将被返回。 
    返 回 值:如果函数调用成功,返回值是非零值,如果函数调用失败,返回值是0。 
                      Windows NT:若想获得更多的错误信息,请调用GetLastError函数。 
    备      注:GetTextExtentPoint32用当前所选字体来计算字符串尺寸,按逻辑单位计算的高和宽都没有考虑裁剪取的情况。 
                   由于有的设备紧缩字符,因此一个字符串里字符的范围之和或许不等于字符串的范围。 
                   计算的字符宽度考虑了由SetTextCharacterextra设备的字符间隔。 GetTextExtentPoint32(hdc,szText,lstrlen(szText),&size);    其中size.cx   ,size.cy   即所求.字符串的长度和高度(是像素),Windows CE环境下GetTextExtentPoint32与GetTextExtentPoint相同。    有一个步骤是必须的,就是取得主窗口的FONT,然后设置DC的FONT,然后再计算,这样才正确,参考下面的代码   
      CStatic   *temp=(CStatic   *)GetDlgItem(IDC_STATIC1);   
      CRect   rect;   
      CSize   size(0,0);   
      temp->GetWindowRect(rect);   
      ScreenToClient(&rect);   
      CClientDC   dc(temp);   
      CFont   *pOldFont=dc.SelectObject(this->GetFont());   
      CString   str;   
      temp->GetWindowText(str);   
      if(::GetTextExtentPoint32((HDC)dc,str,str.GetLength(),&size))   
      {   
            rect.right=rect.left+size.cx;   
            rect.bottom=rect.top+size.cy;   
      }   
      else     { 
            temp->SetWindowText("GetTextExtentPoint32   fail   to   get   the   size   of   text!");     } 
      temp->MoveWindow(rect);   
      dc.SelectObject(pOldFont);  
      

  3.   

    楼上说的很对。CFont *pOldFont=dc.SelectObject(this->GetFont());   这步是必须的,否则获取的长度就跟实际不一样了。赞