我通过下面的
lf.lfEscapement= (long)angle*10;//0 ;
lf.lfOrientation= lf.lfEscapement ;
来旋转我的字体,
可是它是按左上角中心旋转的。现在我想通过输出时校准它的坐标,实现字体按照字体本身的中心旋转。写了好久都不准。
帮看看!!!
lf.lfEscapement= (long)angle*10;//0 ;
lf.lfOrientation= lf.lfEscapement ;
来旋转我的字体,
可是它是按左上角中心旋转的。现在我想通过输出时校准它的坐标,实现字体按照字体本身的中心旋转。写了好久都不准。
帮看看!!!
GLYPHMETRICS gm;
MAT2 mat;
GetGlyphOutline(hdc, letter, GGO_BITMAP, &gm, 0, NULL, &mat);
注:
你必须把字体选入hdc中,letter是你要显示的字符ascii码。你所关心的字形数据在机构体gm中
相信这个函数对你有帮助,你自己去仔细看看吧。
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);}