1.CDC *pDC和HDC hdc有什么不同,类似的有CWnd *pWnd和HWnd hwnd
0 v) t8 R9 m4 b# l) n2 `5 I7 | j8 a2 I7 b, x- _# x2 H0 l
pDC 是 类指针 & [1 s+ R( o: b ^: _. w
HDC 是 windows句柄 0 K( X8 a0 h4 y {% _1 w
通过pDC获得hdc:
) _% Z4 o% b q' K5 O6 R1 Q4 o HDC hdc=pDC->GetSafeHdc();
4 L1 x- R" e! P5 b) n$ u- @ 通过hdc获得pDC: 8 Z7 b4 A4 ]( g, D1 u7 G2 Y9 X$ t
CDC *pDC=new CDC; 6 d$ s i a& u1 j: g1 j
pDC->Attach(hdc);
K. K( r g$ E9 @" y2 @) H
" t/ V. k5 y( y4 x6 }$ m
. n+ m/ F2 r2 O9 _8 A# y6 F7 g8 p7 d+ J# L: n8 w+ X. L
2.hDC和CDC有本质区别- ]' {9 N U; ^1 E; q
# X4 ?) @( J1 O: o0 l( L9 f
HDC是WINDOWS的一种数据类型,是设备描述句柄。而CDC是MFC里的一个类,它封装了几乎所有的关于HDC的操作。
& U9 e3 A! ~- k, t4 C! g 也可以这样说,HDC定义的变量指向一块内存,这块内存用来描述一个设备的相关的内容,所以也可以认为HDC定义的是一个指针;而CDC类定义一个对象,这个对象拥有HDC定义的一个设备描述表,同时也包含与HDC相关的操作的函数。这与HPEN和CPen,POINT与CPoint之间的差别是一样的。
1 P0 i0 G( ~0 w; I2 [2 X
& Q1 _/ q; x k4 F6 D! R CDC 是对 hDC 的相关操作进行封装,例如 CDC 的一个 TextOut 函数隐去其错误检测,完全可以简化到这样程度
" t/ Y y( O9 m5 m0 x CDC:TextOut(int x, int y, const CString& str )
+ y o8 K- E* {: f# V { 9 Q: B5 w2 N1 D- ]7 w
TextOut(m_hDC, x, y, (LPCTSTR)str, str.GetLength());
. s# n+ b9 e5 b/ P } + s; Y4 Z8 S: z# Q# Y; e
; ~' K" E" | g- y2 G! { m_hDC 就是 CDC 的成员变量 HDC m_hDC; CDC有一个
2 p( |- o, q1 s2 N, _/ _( X5 K S2 y4 S
operator HDC() const { return m_hDC; }
: n2 F1 f& v8 G; t W2 q% Z 你可以把它当成一个HDC使用
9 M& A' H; x% S4 M/ a. o1 w8 a1 W- Z9 C* P. ?% M
3。this是dc输出目标窗口的指针,通过它可以得到窗口句柄,对象带参构造这有什么奇怪的呢? - X+ Y! N, N+ u& A( g: y, M% _( J
4 G- i# E& V( l: v2 K7 U. v P
CPaintDC 无效区dc,相当于BeginPaint, EndPaint & S! ]4 u. q4 k, C
CClientDC 客户区dc,相当于GetDC, ReleaseDC
' `0 @. r9 |/ h N CWindowDC 整窗口dc, 相当于GetWindowDC, ReleaseDC ! t" |5 J# L5 i; g' P2 ~
CDC 任何dc, 相当于CreateDC, DeleteDC |