我通过下面的
lf.lfEscapement= (long)angle*10;//0 ;
lf.lfOrientation= lf.lfEscapement ;
来旋转我的字体,
可是它是按左上角中心旋转的。现在我想通过输出时校准它的坐标,实现字体按照字体本身的中心旋转。写了好久都不准。
帮看看!!!

解决方案 »

  1.   


    GLYPHMETRICS gm;
    MAT2 mat;
    GetGlyphOutline(hdc, letter, GGO_BITMAP, &gm, 0, NULL, &mat);
    注:
    你必须把字体选入hdc中,letter是你要显示的字符ascii码。你所关心的字形数据在机构体gm中
    相信这个函数对你有帮助,你自己去仔细看看吧。
      

  2.   

    首先要先创建字体
    CFontfont;
    CFont*poldFont;
    COLORREFoldTextColor;
    LOGFONTlogfont;//固有属性
    logfont.lfWeight = 0;
    logfont.lfWidth = 0;
    logfont.lfEscapement = 0;
    logfont.lfOrientation = 0;
    logfont.lfStrikeOut = FALSE;
    logfont.lfCharSet = DEFAULT_CHARSET;
    logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
    logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    logfont.lfQuality = DEFAULT_QUALITY;
    logfont.lfPitchAndFamily = DEFAULT_PITCH;
    logfont.lfItalic = FALSE;
    logfont.lfUnderline = FALSE;//自定义属性
    strcpy(logfont.lfFaceName , “宋体”);//字体
    logfont.lfHeight= (int)(m_FontSize* scale);//字体大小
    if(m_Bold)//是否加重
    logfont.lfWeight = FW_HEAVY;
    else
    logfont.lfWeight = FW_NORMAL;
    logfont.lfClipPrecision = CLIP_LH_ANGLES;
    logfont.lfEscapement = -10*m_RollAngle;//字体旋转角度0、90、180、270,注意他乘的系数是-10font.CreateFontIndirect(&logfont);poldFont = (CFont *)pDC->SelectObject(&font);
    要实现文字的旋转显示效果,必须重新计算每个字的位置坐标,以下函数可实现
    void DrawRollMulLineText(CDC *pDC,CRect &rect,CString text,float rAngle)
    {
    CStringstrWord;
    intlocX;
    intlocY;
    intnWords;
    inti;
    CSizeszWord;
    CSizeszOld;
    intbk = pDC->SetBkMode(TRANSPARENT);if(rAngle == 0)
    {
    locX = rect.left + 1;
    locY = rect.top + 1;
    nWords = text.GetLength();
    szOld = pDC->GetOutputTextExtent(_T(" "));for(i = 0; i<nWords;i++)
    {
    strWord = _T("");
    strWord += text.GetAt(i);if(strWord.GetAt(0) == 10 )
    {
    locY += szOld.cy;
    continue;
    }
    if(strWord.GetAt(0) == 13 )
    {
    locX = rect.left + 1;
    continue;
    }if(strWord.GetAt(0) & 0x80)
    {
    strWord += text.GetAt(i+1);
    i++;
    }
    szWord = pDC->GetOutputTextExtent(strWord);if(locX+szWord.cx > rect.right-1)
    {
    if(szWord.cx >= rect.Width())
    return;
    locX = rect.left + 1;
    locY += szOld.cy;
    }if(locY+szWord.cy > rect.bottom-1)
    return;pDC->TextOut(locX,locY,strWord);
    locX += szWord.cx;
    szOld = szWord;
    }
    }
    else if(rAngle == 90)
    {
    locX = rect.left + rect.Width() - 1;
    locY = rect.top + 1;
    nWords = text.GetLength();
    szOld = pDC->GetOutputTextExtent(_T(" "));
    szOld.cy = szOld.cy - 2;for(i = 0; i<nWords;i++)
    {
    strWord = _T("");
    strWord += text.GetAt(i);if(strWord.GetAt(0) == 10 )
    {
    locX -= szOld.cy;
    continue;
    }
    if(strWord.GetAt(0) == 13 )
    {
    locY = rect.top + 1;
    continue;
    }if(strWord.GetAt(0) & 0x80)
    {
    strWord += text.GetAt(i+1);
    i++;
    }
    szWord = pDC->GetOutputTextExtent(strWord);
    szWord.cy = szWord.cy - 2;if(locY+szWord.cx > rect.bottom-1)
    {
    if(szWord.cx >= rect.Height())
    return;
    locX -= szOld.cy;
    locY = rect.top + 1;
    }if(locX-szWord.cy < rect.left+1)
    return;pDC->TextOut(locX,locY,strWord);
    locY += szWord.cx;
    szOld = szWord;
    }
    }
    else if(rAngle == 180)
    {
    locX = rect.left + rect.Width() - 1;
    locY = rect.top + rect.Height() - 1;
    nWords = text.GetLength();
    szOld = pDC->GetOutputTextExtent(_T(" "));for(i = 0; i<nWords;i++)
    {
    strWord = _T("");
    strWord += text.GetAt(i);if(strWord.GetAt(0) == 10 )
    {
    locY -= szOld.cy;
    continue;
    }
    if(strWord.GetAt(0) == 13 )
    {
    locX = rect.left + rect.Width() - 1;
    continue;
    }if(strWord.GetAt(0) & 0x80)
    {
    strWord += text.GetAt(i+1);
    i++;
    }
    szWord = pDC->GetOutputTextExtent(strWord);if(locX-szWord.cx < rect.left + 1)
    {
    if(szWord.cx >= rect.Width())
    return;
    locX = rect.left + rect.Width() - 1;
    locY -= szOld.cy;
    }if(locY-szWord.cy < rect.top + 1)
    return;pDC->TextOut(locX,locY,strWord);
    locX -= szWord.cx;
    szOld = szWord;
    }
    }
    else if(rAngle == 270)
    {
    locX = rect.left + 1;
    locY = rect.top + rect.Height() - 1;
    nWords = text.GetLength();
    szOld = pDC->GetOutputTextExtent(_T(" "));
    szOld.cy = szOld.cy - 2;for(i = 0; i<nWords;i++)
    {
    strWord = _T("");
    strWord += text.GetAt(i);if(strWord.GetAt(0) == 10 )
    {
    locX += szOld.cy;
    continue;
    }
    if(strWord.GetAt(0) == 13 )
    {
    locY = rect.top + rect.Height() - 1;
    continue;
    }if(strWord.GetAt(0) & 0x80)
    {
    strWord += text.GetAt(i+1);
    i++;
    }
    szWord = pDC->GetOutputTextExtent(strWord);
    szWord.cy = szWord.cy - 2;if(locY-szWord.cx < rect.top + 1)
    {
    if(szWord.cx >= rect.Height())
    return;
    locX += szOld.cy;
    locY = rect.top + rect.Height() - 1;
    }if(locX+szWord.cy > rect.right-1)
    return;pDC->TextOut(locX,locY,strWord);
    locY -= szWord.cx;
    szOld = szWord;
    }
    }pDC->SetBkMode(bk);}