CDC和HDC的区别与转换

本文详细阐述了Windows编程中CDC(MFC类)与HDC(设备描述句柄)的区别与联系,包括如何获取和转换这两种类型,并解释了它们在绘图上下文中的角色。
CDC和HDC的区别与转换


一、区别与联系
HDC是句柄;CDC是MFC封装的Windows   设备相关的一个类;CClientDC是CDC的衍生类,产生对应于Windows客户区的对象
HDC是WINDOWS的一种数据类型,是设备描述句柄。
而CDC是MFC里的一个类,它封装了几乎所有的关于HDC的操作。   
也可以这样说,HDC定义的变量指向一块内存,这块 内存用来描述一个设备的相关的内容,所以也可以   认为HDC定义的是一个指针;而CDC类定义一个对象,   这个对象拥有HDC定义的一个设备描述表,同时也包   含与HDC相关的操作的函数。   
这与HPEN和CPen,POINT与CPoint之间的差别是一样的。


二、获得CDC *
CDC* pDC
pDC=GetDC();


三、获得hdc
HDC hDC;
1,hDC=GetDC(pCxp->hWnd);
2,pDC->m_hDC;
3,
MEMDCXP Mdcxp;
GetMemDCXP(&Mdcxp);
hDC = Mdcxp.hMemDC;
4,hDC=::GetDC(HWND handle)


四、转换
CDC* pDC
HDC hDC;
pDC=Attach(hDC);
hDC=GetSafeHDC(pDC);
pDC->m_hDC==hDC




CDC、HDC、pDC
1.CDC *pDC和HDC hdc有什么不同,类似的有CWnd *pWnd和HWnd?


pDC是类指针
HDC是windows句柄
通过pDC获得hdc:
HDC hdc=pDC->GetSafeHdc();
通过hdc获得pDC:
CDC *pDC=new CDC;
pDC->Attach(hdc);


2.hDC和CDC有本质区别


HDC是WINDOWS的一种数据类型,是设备描述句柄。而CDC是MFC里的一个类,它封装了几乎所有的关于HDC的操作。也可以这样说,HDC定义的变量指向一块内存,这内存用来描述一个设备的相关的内容,所以也可以认为HDC定义的是一个指针;而CDC类定义一个对象,这个对象拥有HDC定义的一个设备描述表,同时也包含与HDC相关的操作的函数。这与HPEN和CPen,POINT与CPoint之间的差别是一样的。


CDC是对hDC的相关操作进行封装,例如CDC的一个TextOut函数隐去其错误检测,完全可以简化到这样程度CDC:TextOut( int x, int y, const CString& str )
{
    TextOut( m_hDC, x, y, (LPCTSTR)str, str.GetLength() );
}


m_hDC就是CDC的成员变量HDC m_hDC;
CDC有一个operator HDC() const { return m_hDC; }   
你可以把它当成一个HDC使用


3.this是dc输出目标窗口的指针,通过它可以得到窗口句柄,对象带参构造这有什么奇怪的呢?   
    
    CPaintDC        无效区dc,相当于BeginPaint,    EndPaint   
    CClientDC       客户区dc,相当于GetDC,         ReleaseDC   
    CWindowDC       整窗口dc, 相当于GetWindowDC,   ReleaseDC   
    CDC             任何dc,   相当于CreateDC,      DeleteDC
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值