把界面上静态文本控件的尺寸根据文本的内容自动调整大小(转)

   函数功能:该函数计算指定的正文字符串的高度和宽度。
   函数原型: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); 

posted @ 2009-11-19 13:39  木瓜脑袋  阅读(953)  评论(0)    收藏  举报