设备描述表DC

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 )	//选入调色板到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时使用。

例如,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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值