设备描述表DC

来源:互联网 发布:别人盗用身份证开淘宝 编辑:程序博客网 时间:2024/05/17 09:24

Win32下获取DCAPI函数有:

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

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

HDC GetWindowDC(HWND hWnd):返回hWnd参数所指定的窗口的HDC包括非客户区,如标题栏、菜单、滚动条,以及边框等。hWndNULL时,获取整个屏幕的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 hdcHGDIOBJECT hgdiobject)时,采用了重载技术,即它针对不同的GDI对象,提供了如下名同而参数不同的成员函数:

SelectObject(CPen *pen)//用于选入笔SelectObject(CBitmap* pBitmap)//用于选入位图SelectObject(CRgn *pRgn)//用于选入剪裁区域SelectObject(CBrush *pBrush)//用于选入刷子SelectObject(CFont *pFont)//用于选入字体SelectPalette(CPalette *pPalette,BOOL bForceBackground )//选入调色板到DCRealizePalletter()//实现逻辑调色板到物理调色板的映射

直接使用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时使用。

例如,MFCCViewWM_PAINT消息的实现方法如下:

void CView::OnPaint(){CPaintDC dc(this);OnPrepareDC(&dc);OnDraw(&dc);}

l CMetaFileDC:用于生成元文件。

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



原创粉丝点击