`

《MFC那点儿事》の设备上下文DC

 
阅读更多

设备上下文DC是一个Windows数据结构,它包含了某个设备的绘制属性。通常,绘制调用都是借助于上下文对象,而这些设备上下文对象封装了用于画线、形状、文本等的Windows API。设备上下文是设备无关的,所以它既可以用于绘制屏幕,也可以用于绘制打印机甚至元文件。设备上下文在内存中创建,而内存经常受到扰动,所以它的地址是不固定的。因此,一个设备上下文句柄不是直接指向设备上下文对象,而是指向另外一个跟踪设备上下文地址的指针。

设备上下文可分为4种:

1)显示设备上下文

主要用于显示设备上的绘制操作,当应用绘制客户区时,它需要调用BeginPaintGetDCGetDCEx函数获取显示设备上下文。绘制结束后,需要调用EndPaintReleaseDC函数释放它。

2)打印机设备上下文

应用程序以合适的参数(如打印机驱动名、打印机名等)调用函数CreateDC,完成打印任务后,就会调用DeleteDC,以删除打印机设备上下文。

3)内存设备上下文

主要为特定的设备存储位图,它支持在位图上进行绘制操作。通常通过调用CreateCompatibleDC来获取内存设备上下文,当系统处理这个调用时,它将在内存中创建一个和原始设备颜色格式兼容的位图。

内存设备上下文将系统内存用作显示表面,通常使用内存设备上下文预先在系统内存中绘制复杂的图形,然后再快速地将其复制到实际的设备上下文的显示表面上,而绘制图形的结果仍保存在内存设备上下文的DDB中。

4)信息设备上下文

主要用于获取默认设备的数据。如调用函数CreateIC,以便为打印机的特定模型创建信息设备上下文,然后调用函数GetCurrentObjectGetObject来获取默认的画笔和画刷的属性。在使用完信息设备上下文之后,需调用DeleteDC以删除设备上下文。

MFC中,CDC类封装了绘图所需要的所有成员函数,以及各种类型的Windows设备上下文的全部功能。

CDC类有两个成员变量:m_hDCm_hAttribDC,它们都是Windows设备上下文句柄。在创建CDC对象时,它们指向同一个设备。CDC设备使用m_hDC对其所有的成员函数作输出调用;而使用m_hAttribDC对其所有成员函数作属性调用。一般情况下,这两个成员变量的值是一样的,如果需要的话,可以将它们初始化为不同的设备句柄,如在使用CMetaFileDC类时(CMetaFileDC从物理设备上获取设备信息,而输出却在元文件上,所以m_hDCm_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派生类

1CPaintDC—封装了对BeginPaintEndPaint的调用

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();

}

2CClientDC—管理窗口客户区对应的显示设备上下文

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++类对象的绑定

}

3CWindowDC—管理与整个窗口对应的显示设备上下文,包括它的框架和控件

构造函数如下:

CWindowDC::CWindowDC(CWnd* pWnd)

{

ASSERT(pWnd == NULL || ::IsWindow(pWnd->m_hWnd));

if(!Attach(::GetWindowDC(m_hWnd = pWnd->GetSafeHwnd())))

AfxThrowResourceException();

}

释放设备上下文使用的是ReleaseDC,析构函数和CClientDC完全一样。此类对象主要用于窗口的非客户区,如在响应消息WM_NCPAINT时,就可以在非客户区上进行绘制,不过一般很少使用该类。

4CMetaFileDC—与带有元文件的设备上下文相关联

在设备上下文中可以完成如下操作:枚举现有的图形对象、选入新的图形对象、删除现存的图形对象、保存当前的图形对象以及它们的属性、恢复先前保存的图形对象以及它们的属性以及其他操作等。

分享到:
评论

相关推荐

    MFC中的DC、CDC、HDC、句柄、设备上下文究竟是什么意思?

    MFC 中的 DC、CDC、HDC、句柄、设备上下文详解 MFC(Microsoft Foundation Classes)是一种功能强大的C++类库,广泛应用于Windows应用程序开发中。在MFC中,DC、CDC、HDC、句柄和设备上下文都是非常重要的概念,...

    MFC中的DC、CDC、HDC、句柄、设备上下文

    MFC中的DC、CDC、HDC、句柄、设备上下文

    精通mfc---上下文帮助

    上下文帮助\help.rtf 制作的RTF文件 上下文帮助\help.hpj 制作的HPJ文件 上下文帮助\help.hlp 制作的HLP文件 上下文帮助\autohelp 自动添加WinHelp帮助实例源码 上下文帮助\autohelp 自动添加...

    MFC中的DC、CDC、HDC、句柄、设备上下文.doc

    MFC中的DC、CDC、HDC、句柄、设备上下文 MFC提供数百个类,最重要的、也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石。

    MFC 保存DC的方法

    在Microsoft Foundation Classes (MFC)库中,Device Context (DC)是Windows图形设备接口(GDI)中的一个重要概念,它代表了系统与图形设备(如屏幕、打印机等)交互的上下文。DC包含了设备的状态信息,如颜色设置、...

    MFC程序设计详细实例 第18章 上下文帮助

    MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细实例 第18章 上下文帮助MFC程序设计详细...

    MFC下HID设备读写

    综上所述,"MFC下HID设备读写"涉及到MFC应用开发、HID设备编程、DLL封装、用户界面设计等多个方面,需要对Windows API有深入的理解,同时也需要具备良好的软件工程实践,以确保代码的稳定性和可维护性。通过这样的...

    MFC实现半透明效果图片

    为了在对话框上显示位图并设置其透明度,我们需要创建一个兼容的设备上下文(DC,Device Context)。CClientDC类可以用来获取当前窗口的设备上下文。 ```cpp CClientDC dc(this); // 获取当前窗口的设备上下文 CDC ...

    基于MFC编写的读写USB_HID设备数据程序(供参考学习)

    基于MFC编写的读写USB_HID设备数据程序 一、基于MFC的USB_HID设备数据读写程序概述 本文档提供了一个基于MFC的USB_HID设备数据读写程序,旨在帮助读者了解如何使用MFC来编写读写USB_HID设备数据的程序。该程序详细...

    MFC实现获取电脑设备信息

    利用MFC获取电脑设备信息,CPU,硬盘序列号等,已完整实现

    CDC.rar_MFC_MFC文本输出

    在Windows平台上,应用程序的图形设备接口(graphics device interface,GDI)被抽象为设备上下文(Device Context,DC)。 在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义。...

    详解DC,HDC

    DC 是一个抽象的设备上下文,表示一个与设备相关的图形上下文,可以是屏幕、打印机、图像等设备。HDC 则是 DC 的句柄,用于标识某个特定的 DC。 在 MFC 中,CDC 和 CWnd 是两个重要的类,CDC 是一个 Device Context...

    mfc绘图小软件-mfc作业

    MFC的绘图主要通过`CDC`(Device Context,设备上下文)类进行,这是Windows图形设备接口(GDI)的核心部分。`CDC`提供了对屏幕、打印机等设备的抽象,使开发者能够进行各种图形操作,如线条绘制、填充形状、文本...

    MFC渲染opengl平台搭建

    这是通过调用AfxGetMainWnd()->GetDC()获取设备上下文(Device Context, DC),然后使用wglCreateContext()函数创建OpenGL上下文。之后,通过wglMakeCurrent()激活这个上下文,使其成为当前正在使用的OpenGL上下文。...

    MFC简单绘图的示例从内存画出显示到客户区

    创建`CBitmap`对象后,可以调用`CreateCompatibleBitmap`方法,传入设备上下文(DC,Device Context)对象和所需的宽度与高度来创建与当前设备兼容的位图。 接下来,我们需要一个内存设备上下文(Memory DC)来在位...

    Visual_C++MFC之Lesson10创建兼容DC

    Visual_C++MFC之Lesson10创建兼容DC

    在MFC中MSChart保存图片和打印

    这段代码首先创建了一个与当前窗口设备上下文兼容的设备上下文对象,然后创建了一个位图并将其选入设备上下文。接着,调用`DrawToDC`方法将MSChart控件的内容绘制到位图上。最后,使用GDI+库将位图保存为PNG文件。 ...

    MFC图形绘制-画线

    首先,我们要了解MFC中的设备上下文(Device Context,DC)概念。设备上下文是Windows图形系统的一个抽象,它包含了绘制操作所需的信息,如颜色、字体和刷子。在MFC中,CDC(Class Device Context)类封装了设备上...

    MFC双缓冲DC类

    MFC自定义的双缓冲DC封装类,简洁易用,自己编写的,大型项目中提取

    MFC透明贴图实例代码

    2. **设备上下文**:设备上下文(CDC)是MFC中用于图形绘制的核心对象。你需要获取一个与目标窗口关联的设备上下文,这样就可以在该窗口上绘制位图。 3. **选择位图到设备上下文**:使用CDC的`SelectObject()`函数...

Global site tag (gtag.js) - Google Analytics