关于BeginPath之后的问题

    试了下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);  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值