`
mengdejun
  • 浏览: 408834 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mfc双缓冲类封装

MFC 
阅读更多
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类

    自定义的MFC双缓冲DC类通常会封装这些操作,提供易于使用的接口,如`BeginDraw`、`DrawSomething`、`EndDraw`等方法。在大型项目中,这样的封装可以提高代码的可读性和复用性,减少错误,并且便于维护。 在实际应用...

    MFC双缓冲绘图源码

    本文将深入探讨MFC双缓冲绘图技术及其在IDC_STATIC控件上的应用,同时提供相关的源码解析。 双缓冲绘图是一种优化图形绘制性能的技术,它能有效地减少屏幕闪烁,提升用户体验。在传统的单缓冲绘图中,每当图形更新...

    MFC 双缓冲画图小例子

    在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的双缓冲画图技术,并通过一个简单的小实例程序来展示其工作原理。MFC是微软提供的一套C++库,用于构建Windows应用程序,它封装了许多Windows API,...

    MFC_GdiPlus_双缓冲

    在IT行业中,尤其是在Windows应用程序开发领域,MFC (Microsoft Foundation Classes) 是一个广泛使用的C++库,它提供了封装Windows API的类,使开发者能够更容易地创建用户界面和处理系统任务。GDI+(Graphics ...

    基于VS2010的MFC时钟绘制(双缓冲防闪烁)

    在本文中,我们将深入探讨如何使用Visual Studio 2010中的MFC(Microsoft Foundation Classes)库来开发一个基于双缓冲技术的时钟程序,以此防止屏幕闪烁并提供平滑的用户界面体验。 首先,MFC是微软为Windows平台...

    mfc+双缓冲+opengl框架

    标题中的“mfc+双缓冲+opengl框架”揭示了我们即将探讨的是一个结合了Microsoft Foundation Classes (MFC),双缓冲技术以及OpenGL图形库的应用程序框架。MFC是微软为Windows平台开发桌面应用程序提供的一套类库,它...

    MFC用双缓冲技术实现绘制小球移动

    在`TESTBUFFDRAW`这个项目中,你可能找到了相关的源代码文件,包括C++类定义、消息处理函数等,这些文件展示了如何在MFC框架下实现双缓冲技术的具体示例。通过阅读和理解这些代码,你可以更深入地了解如何在实际项目...

    MFC 写的基于GDI绘图 用到双缓冲

    本项目利用MFC编写了一个基于GDI(Graphics Device Interface)的绘图程序,特别采用了双缓冲技术来提高图形绘制的效率和质量。 GDI是Windows操作系统内置的一种图形设备接口,它允许程序员控制屏幕输出,包括绘制...

    mfc_子类化+双缓冲

    在MFC中,可以使用`CDC`类的`CreateCompatibleDC`、`CreateCompatibleBitmap`、`SelectObject`、`BitBlt`等函数来实现双缓冲。以下是一个简单的示例: ```cpp CDC memDC; memDC.CreateCompatibleDC(pDC); // 创建...

    MFC的电子时钟 双缓冲防闪烁

    在MFC的小型时钟程序中,开发者可能使用了`CDC`类来处理这些操作,`CDC`是MFC对Windows GDI(Graphics Device Interface)的封装,提供了丰富的绘图功能。`OnPaint()`函数是关键,它会被系统调用来进行界面的重绘,...

    opengl封装类在MFC中的调用

    4. 更新和显示:在MFC的消息循环中,响应WM_PAINT消息,调用SwapBuffers()函数来交换前后缓冲,实现双缓冲防止闪烁。 5. 清理资源:在应用程序关闭时,需要释放OpenGL资源,比如删除渲染上下文和设备上下文。 在...

    DBBTest 双缓冲绘图对比,性能测试 - 基于MFC源代码

    在本文中,我们将深入探讨"DBBTest 双缓冲绘图对比,性能测试 - 基于MFC源代码"这一主题,重点关注双缓冲技术在图形绘制中的应用、性能优化以及MFC框架的相关知识。 首先,双缓冲绘图是一种提高图形用户界面(GUI)...

    MFC基于对话框下的OpenGL

    8. **扩展和优化**:还可以考虑使用双缓冲技术提高画面流畅性,或者通过扩展函数支持更高级的OpenGL特性,如纹理映射、光照效果等。 以上就是在MFC对话框下使用OpenGL的基本流程。实际开发中,你可能还需要处理错误...

    MFC串口通讯接受数据双缓冲画波形图

    在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)进行串口通讯,并通过双缓冲技术绘制接收到的数据波形图。MFC是微软提供的一套C++库,用于构建Windows应用程序,它封装了许多Windows API,...

    mfc 时钟 有闹钟 利用了双缓冲技术

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来开发一个具有闹钟功能的时钟应用,并且这个应用采用了双缓冲技术来提高界面更新的效率和流畅性。MFC 是 Microsoft 提供的一个 C++ 类库,它...

    双缓冲绘图实现图片查看格式转换器

    2、添加CMemDC.h文件(双缓冲绘图封装) 3、改造OnDraw(CDC* pDC)函数 4、在CPicZoomView类添加鼠标各类消息跟事件消息响应 PS:双缓冲绘图为两步:一是创建内存DC,二是重写OnEraseBkgnd(CDC* pDC)函数。

    GDI.zip_MFC_gdi_gdi 画线_gdi+画线_双缓冲

    本压缩包"**GDI.zip**"中包含的是关于MFC(Microsoft Foundation Classes)框架下使用GDI和GDI+进行图形绘制的示例代码,特别是关于画线和实现双缓冲技术的实践应用。 首先,让我们详细了解一下**GDI**。GDI是...

    基于VS2010的MFC时钟绘制(双缓冲防闪烁)Clock_rezip.zip

    在本文中,我们将深入探讨如何使用Visual Studio 2010中的MFC(Microsoft Foundation Classes)库来开发一个基于双缓冲技术的时钟程序,以此防止屏幕闪烁并提供平滑的用户界面体验。 MFC是微软为Windows平台开发...

Global site tag (gtag.js) - Google Analytics