MemDC.h
#ifndef _MEMDC_H_ #define _MEMDC_H_ ////////////////////////////////////////////////// // CMemDC - memory DC // // Author: Keith Rule // Email: keithr@europa.com // Copyright 1996-2002, Keith Rule // // You may freely use or modify this code provided this // Copyright is included in all derived versions. // // History - 10/3/97 Fixed scrolling bug. // Added print support. - KR // // 11/3/99 Fixed most common complaint. Added // background color fill. - KR // // 11/3/99 Added support for mapping modes other than // MM_TEXT as suggested by Lee Sang Hun. - KR // // 02/11/02 Added support for CScrollView as supplied // by Gary Kirkham. - KR // // This class implements a memory Device Context which allows // flicker free drawing. class CMemDC : public CDC { private: CBitmap m_bitmap; // Offscreen bitmap CBitmap* m_oldBitmap; // bitmap originally found in CMemDC CDC* m_pDC; // Saves CDC passed in constructor CRect m_rect; // Rectangle of drawing area. BOOL m_bMemDC; // TRUE if CDC really is a Memory DC. public: CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC() { ASSERT(pDC != NULL); // Some initialization m_pDC = pDC; m_oldBitmap = NULL; m_bMemDC = !pDC->IsPrinting(); // Get the rectangle to draw if (pRect == NULL) { pDC->GetClipBox(&m_rect); } else { m_rect = *pRect; } if (m_bMemDC) { // Create a Memory DC CreateCompatibleDC(pDC); pDC->LPtoDP(&m_rect); m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height()); m_oldBitmap = SelectObject(&m_bitmap); SetMapMode(pDC->GetMapMode()); SetWindowExt(pDC->GetWindowExt()); SetViewportExt(pDC->GetViewportExt()); pDC->DPtoLP(&m_rect); SetWindowOrg(m_rect.left, m_rect.top); } else { // Make a copy of the relevent parts of the current DC for printing m_bPrinting = pDC->m_bPrinting; m_hDC = pDC->m_hDC; m_hAttribDC = pDC->m_hAttribDC; } // Fill background FillSolidRect(m_rect, pDC->GetBkColor()); } ~CMemDC() { if (m_bMemDC) { // Copy the offscreen bitmap onto the screen. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), this, m_rect.left, m_rect.top, SRCCOPY); //Swap back the original bitmap. SelectObject(m_oldBitmap); } else { // All we need to do is replace the DC with an illegal value, // this keeps us from accidently deleting the handles associated with // the CDC that was passed to the constructor. m_hDC = m_hAttribDC = NULL; } } // Allow usage as a pointer CMemDC* operator->() { return this; } // Allow usage as a pointer operator CMemDC*() { return this; } }; #endif
MemDC.cpp
#include "stdafx.h" #include "MemDC.h"
相关推荐
自定义的MFC双缓冲DC类通常会封装这些操作,提供易于使用的接口,如`BeginDraw`、`DrawSomething`、`EndDraw`等方法。在大型项目中,这样的封装可以提高代码的可读性和复用性,减少错误,并且便于维护。 在实际应用...
本文将深入探讨MFC双缓冲绘图技术及其在IDC_STATIC控件上的应用,同时提供相关的源码解析。 双缓冲绘图是一种优化图形绘制性能的技术,它能有效地减少屏幕闪烁,提升用户体验。在传统的单缓冲绘图中,每当图形更新...
在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的双缓冲画图技术,并通过一个简单的小实例程序来展示其工作原理。MFC是微软提供的一套C++库,用于构建Windows应用程序,它封装了许多Windows API,...
在IT行业中,尤其是在Windows应用程序开发领域,MFC (Microsoft Foundation Classes) 是一个广泛使用的C++库,它提供了封装Windows API的类,使开发者能够更容易地创建用户界面和处理系统任务。GDI+(Graphics ...
在本文中,我们将深入探讨如何使用Visual Studio 2010中的MFC(Microsoft Foundation Classes)库来开发一个基于双缓冲技术的时钟程序,以此防止屏幕闪烁并提供平滑的用户界面体验。 首先,MFC是微软为Windows平台...
标题中的“mfc+双缓冲+opengl框架”揭示了我们即将探讨的是一个结合了Microsoft Foundation Classes (MFC),双缓冲技术以及OpenGL图形库的应用程序框架。MFC是微软为Windows平台开发桌面应用程序提供的一套类库,它...
在`TESTBUFFDRAW`这个项目中,你可能找到了相关的源代码文件,包括C++类定义、消息处理函数等,这些文件展示了如何在MFC框架下实现双缓冲技术的具体示例。通过阅读和理解这些代码,你可以更深入地了解如何在实际项目...
本项目利用MFC编写了一个基于GDI(Graphics Device Interface)的绘图程序,特别采用了双缓冲技术来提高图形绘制的效率和质量。 GDI是Windows操作系统内置的一种图形设备接口,它允许程序员控制屏幕输出,包括绘制...
在MFC中,可以使用`CDC`类的`CreateCompatibleDC`、`CreateCompatibleBitmap`、`SelectObject`、`BitBlt`等函数来实现双缓冲。以下是一个简单的示例: ```cpp CDC memDC; memDC.CreateCompatibleDC(pDC); // 创建...
在MFC的小型时钟程序中,开发者可能使用了`CDC`类来处理这些操作,`CDC`是MFC对Windows GDI(Graphics Device Interface)的封装,提供了丰富的绘图功能。`OnPaint()`函数是关键,它会被系统调用来进行界面的重绘,...
4. 更新和显示:在MFC的消息循环中,响应WM_PAINT消息,调用SwapBuffers()函数来交换前后缓冲,实现双缓冲防止闪烁。 5. 清理资源:在应用程序关闭时,需要释放OpenGL资源,比如删除渲染上下文和设备上下文。 在...
在本文中,我们将深入探讨"DBBTest 双缓冲绘图对比,性能测试 - 基于MFC源代码"这一主题,重点关注双缓冲技术在图形绘制中的应用、性能优化以及MFC框架的相关知识。 首先,双缓冲绘图是一种提高图形用户界面(GUI)...
8. **扩展和优化**:还可以考虑使用双缓冲技术提高画面流畅性,或者通过扩展函数支持更高级的OpenGL特性,如纹理映射、光照效果等。 以上就是在MFC对话框下使用OpenGL的基本流程。实际开发中,你可能还需要处理错误...
在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)进行串口通讯,并通过双缓冲技术绘制接收到的数据波形图。MFC是微软提供的一套C++库,用于构建Windows应用程序,它封装了许多Windows API,...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来开发一个具有闹钟功能的时钟应用,并且这个应用采用了双缓冲技术来提高界面更新的效率和流畅性。MFC 是 Microsoft 提供的一个 C++ 类库,它...
2、添加CMemDC.h文件(双缓冲绘图封装) 3、改造OnDraw(CDC* pDC)函数 4、在CPicZoomView类添加鼠标各类消息跟事件消息响应 PS:双缓冲绘图为两步:一是创建内存DC,二是重写OnEraseBkgnd(CDC* pDC)函数。
本压缩包"**GDI.zip**"中包含的是关于MFC(Microsoft Foundation Classes)框架下使用GDI和GDI+进行图形绘制的示例代码,特别是关于画线和实现双缓冲技术的实践应用。 首先,让我们详细了解一下**GDI**。GDI是...
在本文中,我们将深入探讨如何使用Visual Studio 2010中的MFC(Microsoft Foundation Classes)库来开发一个基于双缓冲技术的时钟程序,以此防止屏幕闪烁并提供平滑的用户界面体验。 MFC是微软为Windows平台开发...