1.CDC *pDC和HDC hdc有什么不同,类似的有CWnd *pWnd和HWnd hwnd" a3 d- |4 Z: S/ R
/ p7 s4 L8 E$ F8 R. I5 f" u/ \
pDC 是 类指针
/ U" `% F. M5 S3 r# t9 R E HDC 是 windows句柄 % W, o% s2 m+ }2 n1 r
通过pDC获得hdc: 9 W1 f3 K" G! s3 k# _: P
HDC hdc=pDC->GetSafeHdc(); 0 ^ Z1 v2 n3 j1 [$ G
通过hdc获得pDC:
- X- C9 d2 A1 \, {& s" l& x+ x CDC *pDC=new CDC; " D, S" p- B/ F- h7 k
pDC->Attach(hdc);; h) s8 h7 y+ q6 y! v- D
! Y( y: S7 ~( X
( x m u/ b9 C% a0 a8 X
% z" E7 O0 a( S7 P2 l2.hDC和CDC有本质区别$ m8 ~5 X9 g8 w8 W4 n2 U
* h P7 |# D+ [. ^0 _8 G
HDC是WINDOWS的一种数据类型,是设备描述句柄。而CDC是MFC里的一个类,它封装了几乎所有的关于HDC的操作。 ! Z) G1 o2 ^0 c( Q5 H( { [: F
也可以这样说,HDC定义的变量指向一块内存,这块内存用来描述一个设备的相关的内容,所以也可以认为HDC定义的是一个指针;而CDC类定义一个对象,这个对象拥有HDC定义的一个设备描述表,同时也包含与HDC相关的操作的函数。这与HPEN和CPen,POINT与CPoint之间的差别是一样的。' s' f* H* @1 W) }0 V! `* ]
! X" Q% P" d9 S0 ~2 e5 S CDC 是对 hDC 的相关操作进行封装,例如 CDC 的一个 TextOut 函数隐去其错误检测,完全可以简化到这样程度
$ P$ L3 M4 `- y3 m0 H% d: n% G/ q CDC:TextOut(int x, int y, const CString& str ) - a, F1 {. g! _2 K2 ]
{
5 @ z2 @$ n+ W$ B% U' O2 v6 u TextOut(m_hDC, x, y, (LPCTSTR)str, str.GetLength()); ( j) _$ ?* [- n0 o* i& J0 h' c
}
# T( N' k2 s$ }! ], W, t / V- h8 P* y# j3 S0 y3 j
m_hDC 就是 CDC 的成员变量 HDC m_hDC; CDC有一个 ! ]7 V" q5 U" w1 X+ F2 ~1 [
- p7 s- H: ~- s# |+ S
operator HDC() const { return m_hDC; }
' i/ a5 o- ^+ E0 U& w8 a. j 你可以把它当成一个HDC使用
6 L5 N' u, T0 s7 K6 e
1 O3 _5 p2 w% `, ]" A3。this是dc输出目标窗口的指针,通过它可以得到窗口句柄,对象带参构造这有什么奇怪的呢? $ X c' \! E6 [' Z+ a
7 W0 p% N t% [% ?
CPaintDC 无效区dc,相当于BeginPaint, EndPaint
) V; G7 L* K! G CClientDC 客户区dc,相当于GetDC, ReleaseDC 9 E0 v2 p) p. c- m3 e8 Z3 h, F
CWindowDC 整窗口dc, 相当于GetWindowDC, ReleaseDC
! A! R( i; P" f CDC 任何dc, 相当于CreateDC, DeleteDC |