试了下BeginPath EndPath之间进行GDI相关函数的调用构造一个dc相关的path,然后调用pathToRegion将path转换为region,发现总是转换失败,很奇怪。后来无意中发现,createFontIndirect创建一个字体对象,然后将其选入到dc中,之后在beginPath和endPath之间textout,最后调用pathToRegion就成功转换为一个region了。 难道说dc默认的字体就不行? 为啥呢?
搞了半天才发现,不是所有的字体能形成path的。
通常像宋体、楷体_GB2312等TrueType类型的字体才可以,
有一个简单的判断方法,当你打开字体选择对话框时,只有字体前有T符号标记的,才是TrueType字体,当然在CFontDialog中可以指定只显示TrueType字体!
CDC* pDC = GetDC();
LOGFONT lf;
memset (&lf, 0, sizeof(lf));
strcpy (lf.lfFaceName, "楷体_GB2312");
lf.lfCharSet = GB2312_CHARSET;
lf.lfHeight = -MulDiv(64, ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSY), 72);
HFONT hfont = ::CreateFontIndirect(&lf);
if (hfont == NULL)
{
AfxMessageBox ("CreateFontIndirect Failed!");
return;
}
HFONT holdfont = (HFONT) ::SelectObject(pDC->m_hDC, hfont);
pDC->BeginPath ();
pDC->TextOut ( 100, 100, "ABC" );
pDC->EndPath ();
HRGN hrgn = ::PathToRegion(pDC->m_hDC);
if (hrgn == NULL)
{
AfxMessageBox ("PathToRegion Failed!");
return;
}
::SelectClipRgn(pDC->m_hDC, hrgn);
::SelectObject(pDC->m_hDC, holdfont);
for ( int i =0; i < 50; i ++ )
{
pDC->MoveTo ( 100+3*i, 100 );
pDC->LineTo ( 100+3*i, 200 );
}
ReleaseDC(pDC);