利用CMemDC画图的两种方法

解决MFC闪烁的CMemDC类 http://blog.youkuaiyun.com/greless/article/details/73188278 立即下载

方法一: 在VS 2010中有一个类CMemDC, 在MFC下可解决绘图闪烁。

看看MSDN钟怎么说的:

 

 

CMemDC Class


A helper class for a memory device context. The memory device context supports offscreen drawing.

 

 

在库中的声明如下:

 

 

class CMemDC

{

public:

AFX_IMPORT_DATA static BOOL m_bUseMemoryDC;

 

CMemDC(CDC& dc, CWnd* pWnd);

CMemDC(CDC& dc, const CRect& rect);

 

virtual ~CMemDC();

 

CDC& GetDC() { return m_bMemDC ? m_dcMem : m_dc; }

BOOL IsMemDC() const { return m_bMemDC; }

BOOL IsVistaDC() const { return m_hBufferedPaint != NULL; }

 

protected:

CDC&     m_dc;

BOOL     m_bMemDC;

HANDLE   m_hBufferedPaint;

CDC      m_dcMem;

CBitmap  m_bmp;

CBitmap* m_pOldBmp;

CRect    m_rect;

};

 

 

使用方法:

 

// 1、响应WM_ERASEBKGND消息,返回FALSE,这样就不擦除背景了。 
BOOL CDemoView::OnEraseBkgnd(CDC* pDC)  
{ 
 	 return FALSE; 
} 
// 2、在需要作图的地方使用CMemDC。 

 

 

void CDemoView::OnDraw(CDC* pDC)

{

CGestureDemoDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

 

CMemDC dcMem(*pDC, this);

CDC& dc = dcMem.GetDC();

//do anything with graphic object dc;

......

}

 

 

二: 网上有另外一种利用CMemDC继承CDC的方式如下:

 

MemDC.h

 

#ifndef _MEMDC_H_

#define _MEMDC_H_

//////////////////////////////////////////////////

// CMemDC - memory DC

//

// Author: Keith Rule

// Email:  keithr@europa.com

// Copyright 1996-1999, 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

//

// This class implements a memory Device Context which allows

// flicker free drawing.

class CMemDC : public CDC {

protected:

   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.

 

   void Construct(CDC* pDC)

   {

        ASSERT(pDC != NULL); 

        // Some initialization

        m_pDC = pDC;

        m_oldBitmap = NULL;

        m_bMemDC = !pDC->IsPrinting();

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

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

    }

// TRK begin

public:

   CMemDC(CDC* pDC                  ) : CDC() { pDC->GetClipBox(&m_rect); Construct(pDC); }

   CMemDC(CDC* pDC, const RECT& rect) : CDC() { m_rect = rect           ; Construct(pDC); }

// TRK end

 

   virtual ~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

 

 

使用方法类同前面所述:

 

/////////////////////////////////////////////////////////// 
//  How to use: 
/////////////////////////////////////////////////////////// 
// 1、响应WM_ERASEBKGND消息,返回FALSE,这样就不擦除背景了。 
BOOL CDemoView::OnEraseBkgnd(CDC* pDC)  
{ 
 	 return FALSE; 
} 
/////////////////////////////////////////////////////////// 
// 2、在需要作图的地方使用CMemDC。 
 void CDemoView::OnDraw(CDC* pDC) 
 { 
	 CFont  font; 
	 font.CreateFontIndirect(&m_lf); 
	 CMemDC  pMemDC(pDC); 
	 CFont* oldfont = pMemDC->SelectObject(&font); 
   //..Draw something here. 
	 pMemDC->SelectObject(oldfont); 
 } 
/////////////////////////////////////////////////////////// 
// 别忘了加include头文件! 
/////////////////////////////////////////////////////////// 

 

 

VS2008 双缓冲绘图 CMemDC正确使用 编译器:Microsoft Visual Studio 2008 实现功能:棋盘覆盖算法的图形展示。 涉及知识:定时器、STL、基本MFC画图API、双缓冲贴图 立即下载

相关推荐

RapidScada在windows下的安装(详细)

1.下载地址:RapidScada官网 2.版本说明 有Linux版本和Windows版本,看自己的需求下载,推荐下载最新稳定版本。 3.系统要求 4.安装前的准备(windows10) 首先打开Windows功能: 先关闭 Microsoft .NET Framework3.5的 Windows Communication Foundation 子组件。如下图: Microsoft .NET Framework配置按下图勾选: iis安装的功能: 5.安装 解压..

m0_51275803的博客 4263

【MFC】使用CMemDC解决图像显示闪烁问题

图像闪烁原因分析 闪烁的原因是在快速频繁的 调整图像的显示内容时,总是要有一个操作便是刷新背景再填充图像,快速切换图像过程中背景与图像的强烈反差导致了闪烁的问题。 闪烁解决方案 不刷背景 不刷新背景,只刷新前景图片可以有效的解决图像闪烁问题,但是随之而来的如果图像没有完整的覆盖目标区域,未覆盖区域 ...

蒙蒙plus 1080

vscode+keil嵌入式软件开发全流程

vscode+keil嵌入式软件开发全流程

AspringQ的博客 6782

CmemDC类 的使用方法

CmemDC类 的使用方法 CMemDC其实就是对内存DC的创建与删除进行一个包装。 1、在CMemDC的构造函数中创建内存DC; 2、用户可以在CMemDC dc中进行图像的绘制; 3、在CMemDC的析构函数中进行内存DC到目标DC的拷贝,并做相应的GDI对象清理工作。 使用这样的类可以让你的代码有很大程度的简洁。 举个例子: 如果我们不使用CMemDC,一般我们会写下面的一段的代码, CView::OnDraw(CDC*pDC) { CRectrcClient; GetClientRe...

baidu_16370559的博客 1081

ANSYS Fluent中的声学模型:实用指南

文章摘要 本文介绍了ANSYS Fluent中三种气动声学模拟方法:Ffowcs-Williams & Hawkings(FWH)模型、宽带噪声源模型和波动方程模型。FWH模型适用于外部气动声学问题,需要瞬态流场数据来预测远场噪声;宽带模型基于稳态RANS模拟,可快速识别噪声源位置,适合早期设计阶段;波动方程模型直接求解声波方程,提供全域声压分布,但仅适用于低马赫数流动。文章详细说明了各模型的使用场景、设置步骤和关键参数配置,为工程应用提供了实用指南。

weixin_45793544的博客 1322

深入解析五大ADC芯片架构及其应用场景

本文深入解析了五大ADC芯片架构及其应用场景,包括逐次逼近型ADC、Σ-Δ型ADC、流水线型ADC、闪存型ADC和积分型ADC。通过详细的架构分析和实际应用案例,帮助工程师理解不同ADC芯片的特点和适用场景,提升电路设计效率。

weixin_28702105的博客 355

MFC提供的CMemDC类的使用方法

CMemDC是一个很经典的内存DC,实现了MFC的双缓冲绘图。不能直接使用CMemDC dcMem(*GetDC(), this),会造成整个对话框黑屏。应该这样使用: CDC* pDCPaint; pDCPaint = NULL; CMemDC memDC(*pDCPaint, this); CDC* pDC = &memDC.GetDC();  ...

woniulx2014的博客 2525

Android 音频源码分析——音量调节流程

源码分析基于android9.0 一、声音类型 对于大多数手机用户来说,操作手机音量按键可以看到,声音类型分为四种:媒体、铃声、闹钟、通话,但是其系统内部则分为十几种类型。 声⾳类型用来区分不同播放用途及播放设备,包含11中类型 定义在 frameworks/base/media/java/android/media/AudioSystem.java中 /** Used to identify the default audio stream volume */ public static final in

奋斗的菜鸟ing 3818

利用CMemDC画图的两种方法(解决绘图闪烁)

转自http://blog.youkuaiyun.com/mplus/article/details/6131526 方法一: 在VS 2010中有一个类CMemDC, 在MFC下可解决绘图闪烁。 看看MSDN钟怎么说的: CMemDC Class A helper class for a memory device context. The memory device con

yinqiaohua的专栏 762

AD7920实战:从咪头到ADC的音频信号采集电路设计全解析(附电路图)

本文详细解析了基于AD7920 ADC芯片的音频信号采集电路设计全流程。从驻极体咪头的驱动、AD8542运放的两级增益与偏置设计,到关键的抗混叠滤波器配置,以及ADC接口的驱动缓冲与PCB布局要点,提供了完整的实战指南与电路图,帮助开发者实现高质量音频信号采集。

red88的博客 802

使用 Simulink + Simscape Electrical 实现一个三相半控桥式整流器的仿真模型

本文详细介绍了使用Simulink搭建三相半控桥式整流器仿真模型的方法。主要内容包括系统结构设计、建模步骤(从创建项目到参数配置)、移相触发控制的实现,以及阻感负载下的动态响应分析。通过合理设置三相电源、整流器模块、触发控制和测量模块,实现了输出电压和电流波形的仿真观测。文章还提供了优化建议,如添加滤波器、实时控制等改进方向,为电力电子变换器的仿真研究和性能优化提供了实用指导。

amy_mhd的博客 140

CMemDC画图的两种方法

方法一: 在VS 2010中有一个类CMemDC, 在MFC下可解决绘图闪烁。     看看MSDN钟怎么说的:    CMemDC Class    A helper class for a memory device context. The memory device context supports offscreen drawing.    在库中的声明如下:class CMemDC{p...

barry1020441722的博客 584

基于单片机设计的智能消防排烟窗控制系统_422

随着城市化进程的不断加快,高层建筑、大型商业综合体以及地下空间的数量迅速增加,建筑内部结构日趋复杂,一旦发生火灾,烟雾和有毒气体往往比明火更具威胁性。大量研究表明,在火灾事故中,人员伤亡的主要原因并非直接烧伤,而是由于吸入烟雾及一氧化碳等有毒气体导致窒息。因此,如何在火灾初期快速排烟、降低有害气体浓度,并及时进行预警,成为现代消防系统设计中的关键问题。传统的消防排烟系统多依赖人工操作或简单的联动控制方式,存在响应滞后、自动化程度低、信息反馈不及时等问题。在实际应用中,当火灾发生时,如果不能第一时间开启排烟窗

395

CMemDC代码解

CMemDC是一个很经典的内存DC,实现了MFC的双缓冲绘图。主题实现思路是,将要绘制的背景绘制到内存中,然后在CMemDC析构的时候绘制到屏幕上。 class CMemDC : public CDC { private: CBitmap m_bitmap; CBitmap* m_oldBitmap; CDC* m_pDC; CRect m_rect; BOOL

haoxihuan的专栏 3997

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用CMemDC解决画图闪烁问题

<br />在绘图和画线的时候,只须这样就可以解决闪烁问题.<br />    CMemDC memdc(&dc);<br />    memdc....  // use memdc instead of dc<br />     直接调用memdc代替CDC进行绘制操作<br />    以下是 CMemDC 的源代码,超强.<br />================================================================<br />#ifndef _MEMDC_

609

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

修改后的CMemDC类

修改后的CMemDC类 修改后的CMemDC类:(增加了红色的那行,非常重要喔。另外加了些注释)/////////////////////////////////////////////////////////////////////////////// CMemDC class CMemDC : public CDC{public: C...

weixin_30709929的博客 171

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VS2012 GDI绘图双缓冲 去闪屏问题

VS2012 GDI绘图双缓冲 去闪屏问题 CMemDC类 使用CMemDC类实现双缓冲是非常简单的 CDC *pDC = GetDC(); CMemDC dcMem(*pDC,this); CDC& dc = dcMem.GetDC(); HDC hdc = dc.m_hDC; using namespace Gdiplus; Grap

sdewenking的专栏 1752

欢迎使用优快云-markdown编辑器

为了能够自己实现一些图像处理的算法,所以需要得到图像的数据并能够显示。   图片要使用bmp位图,结构简单而且windows支持很多操作。为了方便所以先使用24位真彩色位图,这种位图没有调色板。   一般画图是在视类的OnDraw中画图,使用StretchDIBits将图像数据直接贴到窗口上。StretchDIBits的第一个参数是HDC的对象。可以直接使用OnDraw的pDC参数中的m_hdc

qq_33230109的博客 211

经典的双缓冲CDC绘图类(解决闪烁问题)

// CMemDC - memory DC//// Author: Keith Rule// Email:  keithr@europa.com// Copyright 1996-1997, Keith Rule//// You may freely use or modify this code provided this// Copyright is included in all deriv

Wendysuly的专栏 880

内存绘图

首先理解内存绘图,即把要绘制的东西先在内存中画好,然后一次性的画到屏幕上来。内存绘图经常用来防止闪烁。因为闪烁的原因是因为反差太大。例如你的绘图过程是先用白色擦除整个窗口,然后再将黑色的文字画到屏幕上来,这样在窗口重绘的时候,原本黑色文字区域就会白光一闪,然后再出现文字,也就是我

技术成就梦想,知识改变命运 ! 2120

dc画图防止闪烁

用dc画图时,总会出现闪烁,出现闪烁的原因是绘制背景和绘制图形之间绘制次数的比例的缘故,一般用来防止闪烁的方法,可以采用双缓存的方法,先将需要绘制的图象绘制到兼容DC上,然后,在将兼容DC上的东西帖到屏幕DC上,当然,要在绘制背景的时候,进行绘制,要不然也会和闪烁的,事例代码如下:BOOL CMemDCView::OnEraseBkgnd(CDC* pDC) { // TODO: Ad

hurry281的专栏 1077
上一篇: 逻辑坐标系 设备坐标系 客户坐标系 屏幕坐标系
下一篇: 无法打开预编译头文件的解决方法及预编译头原理[ZZ]
mplus
博客等级 码龄16年 10粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值