1.CDC *pDC和HDC hdc有什么不同,类似的有CWnd *pWnd和HWnd
pDC是类指针
HDC是windows句柄
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() );
}
{
TextOut( m_hDC, x, y, (LPCTSTR)str, str.GetLength() );
}
m_hDC就是CDC的成员变量HDC m_hDC;
CDC有一个 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
CPaintDC 无效区dc,相当于 BeginPaint, EndPaint
CClientDC 客户区dc,相当于 GetDC, ReleaseDC
CWindowDC 整窗口dc, 相当于 GetWindowDC, ReleaseDC
CDC 任何dc, 相当于 CreateDC, DeleteDC