cwnd、cdc、hwnd和hdc

对于学习VC的朋友来说,这些东西很熟悉了吧?可是我自己还是有点犯糊涂,所以从百度到处搜搜,记载如下。

1.对象和句柄

CWnd是类, HWnd是句柄, CWnd封装了HWnd

AfxGetMainWnd()->m_hwnd;

同样的, CDC和HDC也是这样的关系:

CDC *pDC=new CDC;

HDC hdc;

pDC->GetSafeHdc();//通过对象获得句柄:

pDC->Attach(hdc); //通过句柄获得对象:
HWND是SDK定义的类型,是一个无确切意义的32-bit值,在调用API时用于指代窗体。
CWnd*是一个有确切意义的指针,指向一个MFC窗体类CWnd的实例。因为MFC对SDK做了封装,大部分调用都可以用CWnd*作为参数,所以很容 易混淆。从一个CWnd*获取句柄的方法是pWnd->GetSafeHwnd(),他比 pWnd->m_hWnd安全,因为前者在pWnd == NULL的时候返回NULL而后者出现access violation.

2. CWnd和CDC, hwnd和hdc

所有跟窗口相关的操作都被封装在CWnd类中; 所有跟绘图相关的操作都被封装在CDC类中.

hwnd句柄是描述一个窗口的形状、位置、大小、是否显示、它的父窗口、兄弟窗口、等等的一组数据结构;hdc句柄是一个实实在在的用于具体表现这个窗口时,需要对这个窗口有个场合来实现的地方。

3. 使用不同的CDC绘图

CClientDC客户区dc。CWindowDC整窗口dc。CDC 任何dc。

01 /*
02 CDC *pDC=CWnd::GetDC();
03 //此处直接使用CWnd类的GetDC,其返回值为CDC*
04 //SDK中的同名函数使用返回的是HDC
05  
06 */
07 pDC->MoveTo(m_ptOrigin);
08 pDC->LineTo(point);
09 CWnd::ReleaseDC(pDC);
10  
11 /*//使用CClientDC绘图
12 CClientDC派生自CDC,在构造的时候调用GetDC,
13 在析构的时候调用ReleaseDC。使得我们不必
14 显示调用GetDC与ReleaseDC。
15 */
16 CClientDC dc( this );
17 dc.MoveTo(m_ptOrigin);
18 dc.LineTo(point);
19  
20 /*//使用CWindowDC绘图
21 同样派生自CDC,构造调用GetWindowDC,
22  
23 析构时调用ReleaseDC()。
24 可以访问整个屏幕区域,包括客户区和非客户区。
25 */
26 CWindowDC dc( this );
27 dc.MoveTo(m_ptOrigin);
28 dc.LineTo(point);

超越C++ 原创文章,转载请注明来源并保留原文链接

本文链接:http://www.beyondc.cn/cwnd-cdc-hwnd-and-hdc.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值