不用CDC的成员函数!!!!!!
我开始用API DrawText 将其中的uFormat  参数设置成DT_CALCRECT,但是计算出来的大小始终很小,完全不行。我自己的代码如下:  m_pWnd = new CWindow;
    m_pWnd->Create(_T("STATIC"),m_hWnd,&rc,NULL,WS_CHILD | WS_VISIBLE | WS_EX_STATICEDGE | SS_SUNKEN | SS_NOTIFY  ,0,0U,NULL);
    pfont->pWnd = m_pWnd;
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
::GetObject(::GetStockObject(SYSTEM_FONT),sizeof(lf),&lf);
lf.lfHeight = pfont->nFontSize;
lf.lfWidth = pfont->nFontSize;
_tcscpy(lf.lfFaceName,pfont->pwszFontFamily);
m_hFont = ::CreateFontIndirect(&lf);
pfont->hFont = m_hFont;
    m_pWnd->SetFont(m_hFont);
RECT rect ;
memset(&rect,0,sizeof(rect));
::GetWindowRect(m_hWnd,&rect);
ScreenToClient(&rect);
rect.left = 0;
rect.bottom = 0;
rect.top = 0;
::DrawTextW(::GetDC(m_pWnd->m_hWnd),OLE2T(strText),1,&rect,DT_CALCRECT | DT_SINGLELINE | DT_VCENTER );
望高手指点!如何正确计算???????

解决方案 »

  1.   

    DrawTextW(::GetDC(m_pWnd->m_hWnd),OLE2T(strText),1,&rect,DT_CALCRECT | DT_SINGLELINE | DT_VCENTER );
    长度为1;
    DrawTextW(::GetDC(m_pWnd->m_hWnd),OLE2T(strText),wcslen(OLE2T(strText)),&rect,DT_CALCRECT | DT_SINGLELINE | DT_VCENTER );_tcscpy(lf.lfFaceName,pfont->pwszFontFamily);
    留意一下宽的窄的可能有区别 或者版本问题
    不是很在意就是+1的事,调试的时候看看
      

  2.   

    我觉得,他好像始终是以系统的字体大小来计算的!!!我这样改来,他还是一样,以系统字体大小来计算的!!
     m_pWnd = new CWindow;
        m_pWnd->Create(_T("STATIC"),m_hWnd,&rc,NULL,WS_CHILD | WS_VISIBLE | SS_SUNKEN | SS_NOTIFY  ,0,0U,NULL);
        pfont->pWnd = m_pWnd;
    LOGFONT lf;
    memset(&lf,0,sizeof(LOGFONT));
    ::GetObject(::GetStockObject(SYSTEM_FONT),sizeof(lf),&lf);
    lf.lfHeight = pfont->nFontSize;
    lf.lfWidth = pfont->nFontSize;
    _tcscpy(lf.lfFaceName,pfont->pwszFontFamily);
    m_hFont = ::CreateFontIndirect(&lf);
    pfont->hFont = m_hFont;
    HFONT hOldFont;
        m_pWnd->SetFont(m_hFont);
    hOldFont = (HFONT)::SelectObject(::GetDC(m_pWnd->m_hWnd),(HGDIOBJ)m_hFont);
    RECT rect ;
    memset(&rect,0,sizeof(rect));
    ::GetWindowRect(m_hWnd,&rect);
    ScreenToClient(&rect);
    ::DrawTextW(::GetDC(m_pWnd->m_hWnd),OLE2T(strText),stLen,&rect,DT_CALCRECT | DT_VCENTER );
    m_pWnd->SetWindowText(strText);
    ::SelectObject(::GetDC(m_pWnd->m_hWnd),(HGDIOBJ)hOldFont);
    ::MoveWindow(m_pWnd->m_hWnd,rect.left,rect.top,rect.right - rect.left ,rect.bottom - rect.top,TRUE);
      

  3.   

    比较一下stLen,wcslen(OLE2T(strText)是不是一样的
    系统的字体大小来计算???
    DrawTextW使用""宽字符""UnicodeDrawTextA使用""多字节字符集""
    nt系统最终调用的是ExtTextOutW
      

  4.   

    你的rect能容纳字符长度?
    还是你要计算rect?
      

  5.   

    DT_CALCRECT
    如果正文有多行,使用rect定义的矩形宽度,并扩展底部以容纳正文最后一行,如果只有一行,则改变右边界,容纳正文最后一个字符,上述任何一种情况,返回格式化正文的高度
      

  6.   

    可以试着使用如下的方法来测量:
    CSize size = pdc->GetTextExtent(lpString, lpString.GetLength());
    字体是当前pdc选择的字体。可以重新选择字体以按字体测量。