虽然Gilbert之前介绍过CWndHWnd的区别但是这里和其他几个CDC, HDC放在一起重申一下其中的区别和关系.

1.对象和句柄

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

CWnd wnd;

HWnd hWnd;

wnd.Attach(hWnd);//句柄到对象

    wnd->m_hWnd;// 对象到句柄

当然一般在程序中是这样获得句柄:

AfxGetMainWnd()->m_hwnd;

同样的, CDCHDC也是这样的关系:

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. CWndCDC, hwndhdc

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

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

3. 使用不同的CDC绘图

CClientDC      客户区dc;

CWindowDC      整窗口dc;    

CDC            任何dc;

/*
  CDC *pDC=CWnd::GetDC();
  //此处直接使用CWnd类的GetDC,其返回值为CDC*
  //SDK中的同名函数使用返回的是HDC

*/
  pDC->MoveTo(m_ptOrigin);
  pDC->LineTo(point);
  CWnd::ReleaseDC(pDC);
  


  /*//使用CClientDC绘图
  CClientDC派生自CDC,在构造的时候调用GetDC,
  在析构的时候调用ReleaseDC。使得我们不必
  显示调用GetDCReleaseDC
  */
  CClientDC dc(this);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);

/*//使用CWindowDC绘图
  同样派生自CDC,构造调用GetWindowDC

析构时调用ReleaseDC()
  可以访问整个屏幕区域,包括客户区和非客户区。
  */
  CWindowDC dc(this);
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);

所有知识来自于互联网.

posted on 2011-08-25 16:17  一个人的天空@  阅读(6077)  评论(0编辑  收藏  举报