设备上下文DC是一个Windows数据结构,它包含了某个设备的绘制属性。通常,绘制调用都是借助于上下文对象,而这些设备上下文对象封装了用于画线、形状、文本等的Windows API。设备上下文是设备无关的,所以它既可以用于绘制屏幕,也可以用于绘制打印机甚至元文件。设备上下文在内存中创建,而内存经常受到扰动,所以它的地址是不固定的。因此,一个设备上下文句柄不是直接指向设备上下文对象,而是指向另外一个跟踪设备上下文地址的指针。
设备上下文可分为4种:
1)显示设备上下文
主要用于显示设备上的绘制操作,当应用绘制客户区时,它需要调用BeginPaint、GetDC或GetDCEx函数获取显示设备上下文。绘制结束后,需要调用EndPaint或ReleaseDC函数释放它。
2)打印机设备上下文
应用程序以合适的参数(如打印机驱动名、打印机名等)调用函数CreateDC,完成打印任务后,就会调用DeleteDC,以删除打印机设备上下文。
3)内存设备上下文
主要为特定的设备存储位图,它支持在位图上进行绘制操作。通常通过调用CreateCompatibleDC来获取内存设备上下文,当系统处理这个调用时,它将在内存中创建一个和原始设备颜色格式兼容的位图。
内存设备上下文将系统内存用作显示表面,通常使用内存设备上下文预先在系统内存中绘制复杂的图形,然后再快速地将其复制到实际的设备上下文的显示表面上,而绘制图形的结果仍保存在内存设备上下文的DDB中。
4)信息设备上下文
主要用于获取默认设备的数据。如调用函数CreateIC,以便为打印机的特定模型创建信息设备上下文,然后调用函数GetCurrentObject和GetObject来获取默认的画笔和画刷的属性。在使用完信息设备上下文之后,需调用DeleteDC以删除设备上下文。
MFC中,CDC类封装了绘图所需要的所有成员函数,以及各种类型的Windows设备上下文的全部功能。
CDC类有两个成员变量:m_hDC和m_hAttribDC,它们都是Windows设备上下文句柄。在创建CDC对象时,它们指向同一个设备。CDC设备使用m_hDC对其所有的成员函数作输出调用;而使用m_hAttribDC对其所有成员函数作属性调用。一般情况下,这两个成员变量的值是一样的,如果需要的话,可以将它们初始化为不同的设备句柄,如在使用CMetaFileDC类时(CMetaFileDC从物理设备上获取设备信息,而输出却在元文件上,所以m_hDC和m_hAttribDC是不同的)。
构造函数如下:
CDC::CDC()
{
m_hDC = NULL;
m_hAttribDC = NULL;
m_bPrinting = FALSE;
}
在实践中,CDC不像派生类那样使用::GetDC()等函数来获取一个设备上下文,而是创建一个设备上下文,如CDC::CreateCompatibleDC等。
析构函数:
CDC::~CDC()
{
if(m_hDC != NULL)
::DeleteDC(Detach());
}
具体使用时,MFC提供了以下四个CDC派生类:
1)CPaintDC—封装了对BeginPaint和EndPaint的调用
在Windows应用程序中,通常在绘制图像之前调用BeginPaint,然后在设备上下文中进行一系列绘制操作,最后调用EndPaint函数结束绘制。类CPaintDC正是封装了该过程:在构造CPaintDC对象时,其构造函数自动调用BeginPaint函数;在销毁CPaintDC对象时,其析构函数自动调用EndPaint函数。
在基于框架的应用中,一般在视图类的OnDraw成员函数中处理有关重绘的操作。通过OnPrepareDC成员函数,框架自动向OnDraw成员函数传递一个类型为CPaintDC的设备上下文对象,并且在此对象上进行绘制,而对象的构造和销毁则由框架自动完成。
CPaintDC的构造函数:
CPaintDC::CPaintDC(CWnd* pWnd)
{
ASSERT_VALID(pWnd);
ASSERT(::IsWindow(pWnd->m_hWnd));
if(!Attach(::BeginPaint(m_hWnd = pWnd->m_hWnd, &m_ps)))
AfxThrowResourceException();
}
析构函数:
CPaintDC::~CPaintDC()
{
ASSERT(m_hDC != NULL);
ASSERT(::IsWindow(m_hWnd));
::EndPaint(m_hWnd, &m_ps);
Detach();
}
2)CClientDC—管理窗口客户区对应的显示设备上下文
在CClientDC构造函数中,通过调用GetDC函数而非BeginPaint来获取设备上下文;在析构函数中调用ReleaseDC而非EndPaint:
CClientDC::CClientDC(CWnd* pWnd)
{
ASSERT(pWnd == NULL || ::IsWindow(pWnd->m_hWnd));
//Attach用于将设备上下文句柄和设备上下文类绑定
if(!Attach(::GetDC(m_hWnd = pWnd->GetSafeHwnd())))
AfxThrowResourceException();
}
CClientDC::~CClientDC()
{
ASSERT(m_hDC != NULL);
::ReleaseDC(m_hWnd, Detach());//先解除设备上下文资源与C++类对象的绑定
}
3)CWindowDC—管理与整个窗口对应的显示设备上下文,包括它的框架和控件
构造函数如下:
CWindowDC::CWindowDC(CWnd* pWnd)
{
ASSERT(pWnd == NULL || ::IsWindow(pWnd->m_hWnd));
if(!Attach(::GetWindowDC(m_hWnd = pWnd->GetSafeHwnd())))
AfxThrowResourceException();
}
释放设备上下文使用的是ReleaseDC,析构函数和CClientDC完全一样。此类对象主要用于窗口的非客户区,如在响应消息WM_NCPAINT时,就可以在非客户区上进行绘制,不过一般很少使用该类。
4)CMetaFileDC—与带有元文件的设备上下文相关联
在设备上下文中可以完成如下操作:枚举现有的图形对象、选入新的图形对象、删除现存的图形对象、保存当前的图形对象以及它们的属性、恢复先前保存的图形对象以及它们的属性以及其他操作等。
分享到:
相关推荐
MFC 中的 DC、CDC、HDC、句柄、设备上下文详解 MFC(Microsoft Foundation Classes)是一种功能强大的C++类库,广泛应用于Windows应用程序开发中。在MFC中,DC、CDC、HDC、句柄和设备上下文都是非常重要的概念,...
MFC中的DC、CDC、HDC、句柄、设备上下文
上下文帮助\help.rtf 制作的RTF文件 上下文帮助\help.hpj 制作的HPJ文件 上下文帮助\help.hlp 制作的HLP文件 上下文帮助\autohelp 自动添加WinHelp帮助实例源码 上下文帮助\autohelp 自动添加...
MFC中的DC、CDC、HDC、句柄、设备上下文 MFC提供数百个类,最重要的、也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石。
在Microsoft Foundation Classes (MFC)库中,Device Context (DC)是Windows图形设备接口(GDI)中的一个重要概念,它代表了系统与图形设备(如屏幕、打印机等)交互的上下文。DC包含了设备的状态信息,如颜色设置、...
MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细...
3. **复制到前台缓冲区**: 当后台缓冲区完成绘图后,使用`BitBlt`函数将内存DC的内容一次性复制到窗口的设备上下文(通常是窗口DC),完成屏幕更新。 4. **释放资源**: 最后,记得释放不再使用的位图和内存DC,避免...
在MFC(Microsoft Foundation Class)库中,我们经常利用设备上下文(Device Context,DC)进行图形绘制。本文将深入探讨如何在DC上绘制五角星,基于VS2015开发环境,虽然标题提到五角星,但其实绘制任何多边形的...
在Microsoft Foundation Classes (MFC) 中,屏幕截屏操作是一个常见的任务,主要涉及图形设备接口(GDI)和设备上下文(Device Context, DC)。在这个场景下,我们使用MFC来实现屏幕截图并进行像素级别的处理,最后...
其中,内存设备上下文(Memory Device Context, DC)是一种非常重要的概念,它允许程序员在内存中进行绘图操作,而无需直接在屏幕上绘制。这样可以提高绘图效率,并且方便进行复杂的图形处理。 内存DC主要用于离屏...
综上所述,"MFC下HID设备读写"涉及到MFC应用开发、HID设备编程、DLL封装、用户界面设计等多个方面,需要对Windows API有深入的理解,同时也需要具备良好的软件工程实践,以确保代码的稳定性和可维护性。通过这样的...
为了在对话框上显示位图并设置其透明度,我们需要创建一个兼容的设备上下文(DC,Device Context)。CClientDC类可以用来获取当前窗口的设备上下文。 ```cpp CClientDC dc(this); // 获取当前窗口的设备上下文 CDC ...
基于MFC编写的读写USB_HID设备数据程序 一、基于MFC的USB_HID设备数据读写程序概述 本文档提供了一个基于MFC的USB_HID设备数据读写程序,旨在帮助读者了解如何使用MFC来编写读写USB_HID设备数据的程序。该程序详细...
1. **创建设备上下文(DC)**:首先,你需要创建两个设备上下文,一个是屏幕设备上下文(hdcScreen),用于与屏幕交互;另一个是内存设备上下文(hdcMem),作为后台缓冲区。 2. **创建内存设备上下文**:使用...
在Windows平台上,应用程序的图形设备接口(graphics device interface,GDI)被抽象为设备上下文(Device Context,DC)。 在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义。...
在这个场景中,"dcMFC.rar"是一个压缩包,里面包含了与MFC相关的代码示例,尤其是关于设备上下文(Device Context, DC)的使用。DC是Windows图形系统中用于绘制的基本对象,它存储了绘图操作的状态,如颜色、刷子、...
DC 是一个抽象的设备上下文,表示一个与设备相关的图形上下文,可以是屏幕、打印机、图像等设备。HDC 则是 DC 的句柄,用于标识某个特定的 DC。 在 MFC 中,CDC 和 CWnd 是两个重要的类,CDC 是一个 Device Context...
MFC的绘图主要通过`CDC`(Device Context,设备上下文)类进行,这是Windows图形设备接口(GDI)的核心部分。`CDC`提供了对屏幕、打印机等设备的抽象,使开发者能够进行各种图形操作,如线条绘制、填充形状、文本...
首先,我们需要理解MFC中的关键类,如CWnd和CDC,它们是MFC处理窗口和设备上下文的核心。CWnd是所有窗口类的基类,而CDC则用于图形设备接口(GDI)操作,如绘图、填充和文本输出。 1. **截取窗体图像** 要截取窗体...
这是通过调用AfxGetMainWnd()->GetDC()获取设备上下文(Device Context, DC),然后使用wglCreateContext()函数创建OpenGL上下文。之后,通过wglMakeCurrent()激活这个上下文,使其成为当前正在使用的OpenGL上下文。...