首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

FromHandle不能获取种外的hdc吗?

2013-02-25 
FromHandle不能获取类外的hdc吗???CDC* pDC2pDC2-FromHandle(gdipDraw.hMemDC)//获取类成员HDC,报错跳

FromHandle不能获取类外的hdc吗???


CDC* pDC2;
pDC2->FromHandle(gdipDraw.hMemDC);//获取类成员HDC,报错跳出

[解决办法]
因为FromHandle本身是静态函数,从语法上讲这样使用是没有问题的,通常都是这样用:
  CDC* pdc = CDC::FromHandle(hdc);
或者
  CDC* pdc = NULL;
  pdc = pdc->FromHandle(hdc);
这两种用法是一样的,看起来是空指针,但静态函数调用是允许使用空指针的。

你的问题不是语法,而是FromHandle的内部机制,MFC会把一些句柄资源永久或者临时缓存起来,只有被缓存的句柄才能用FromHandle转换成类指针,而只有MFC创建的句柄才会被缓存(比如CDC::CreateDC/CWnd::Create之类),外部句柄没有机会缓存,恰好你代码中提供的HDC是外部创建的(看名称貌似是GDI+创建的),超出了MFC的管理范围,不能被FromHandle查询到。

解决方案:
CDC dc;
dc.Attach(gdipDraw.hMemDc);
// do something
dc.Detach();
[解决办法]
引用:
如果说,我CDC dc dc.Attach(gdipDraw.hMemDc);//dc局部变量.Attach()不需要Deach()

引用:
因为FromHandle本身是静态函数,从语法上讲这样使用是没有问题的,通常都是这样用:
  CDC* pdc = CDC::FromHandle(hdc);
或者
  CDC* pdc = NULL;
  pdc……

不调用Detach()的话,CDC类的析构函数里会调用Detact操作,还会做DeleteDC删除DC操作

热点排行