GDI编程 之二、设备描述表DC

来源:互联网 发布:淘宝如何出售虚拟物品 编辑:程序博客网 时间:2024/05/17 08:30

二、设备描述表DC

Win32下获取DC的API函数有:

HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint):特定用于WM_PAINT消息

HDC GetDC(HWND hWnd):用于获得hWnd参数所指定窗口的客户区域的HDC。

HDC GetWindowDC(HWND hWnd):返回hWnd参数所指定的窗口的HDC,包括非客户区,如标题栏、菜单、滚动条,以及边框等。hWnd为NULL时,获取整个屏幕的HDC。

 

MFC对上述HDC对象和Win32函数进行了封装,基类为CDC类。CDC类包含了各种Win32 HDC的全部功能。在MFC下,使用CDC的成员函数进行图形绘制和文字输出。

CDC类有两个成员变量:m_hDC,m_hAttribDC,它们都是Windows设备描述表句柄。CDC的成员函数作输出操作时,使用m_Hdc;要获取设备描述表的属性时,使用m_hAttribDC。在创建一个CDC类实例时,缺省的m_hDC等于m_hAttribDC。

 

CDC在封装Win32函数SelectObject(HDC hdc,HGDIOBJECT    hgdiobject)时,采用了重载技术,即它针对不同的GDI对象,提供了如下名同而参数不同的成员函数:

SelectObject(CPen *pen)              //用于选入笔

SelectObject(CBitmap* pBitmap)  //用于选入位图

SelectObject(CRgn *pRgn)           //用于选入剪裁区域

SelectObject(CBrush *pBrush)      //用于选入刷子

SelectObject(CFont *pFont)         //用于选入字体

SelectPalette(CPalette *pPalette,BOOL bForceBackground )    //选入调色板到DC

RealizePalletter()                         //实现逻辑调色板到物理调色板的映射

 

直接使用CDC的例子是内存设备上下文,例如:

CDC dcMem.CreateCompatibleDC(&dc);                  //创建设备描述表

CDC pbmOld = dcMem.SelectObject(&m_bmBall);   //更改设备描述表属性

//作一些绘制操作

dcMem.SelectObject(pbmOld);            //恢复设备描述表的属性

dcMem.DeleteDC();                           //可以不调用,而让析构函数去删除设备描述表

 

从CDC 派生出四个功能更具体的DC类。继承层次如下图所示:

 

下面分别讨论这四种设备描述表。

l  CCientDC:代表窗口客户区的设备描述表。其构造函数CClientDC(CWnd *pWin)通过::GetDC获取指定窗口的客户区的设备描述表HDC,并且使用成员函数Attach把它和CClientDC对象捆绑在一起;其析构函数使用成员函数Detach把设备描述表句柄HDC分离出来,并调用::ReleaseDC释放设备描述表HDC。

l  CPaintDC:仅仅用于响应WM_PAINT消息时绘制窗口,因为它的构造函数调用了::BeginPaint获取设备描述表HDC,并且使用成员函数Attach把它和CPaintDC对象捆绑在一起;析构函数使用成员函数Detach把设备描述表句柄HDC分离出来,并调用::EndPaint释放设备描述表HDC,而::BeginPaint和::EndPaint仅仅在响应WM_PAINT时使用。

例如,MFC中CView对WM_PAINT消息的实现方法如下:

void CView::OnPaint()

{

CPaintDC dc(this);

OnPrepareDC(&dc);

OnDraw(&dc);

}

l  CMetaFileDC:用于生成元文件。

l  CWindowDC:代表整个窗口区(包括非客户区)的设备描述表。其构造函数CWindowDC(CWnd *pWin)通过::GetWindowDC获取指定窗口的客户区的设备描述表HDC,并使用Attach把它和CWindowDC对象捆绑在一起;其析构函数使用Detach把设备描述表HDC分离出来,调用::ReleaseDC释放设备描述表HDC。

0 0
原创粉丝点击