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

{

public:

    AFX_IMPORT_DATA static BOOL m_bUseMemoryDC;

 

    CMemDC(CDCdcCWndpWnd);

    CMemDC(CDCdcconst CRectrect);

 

    virtual ~CMemDC();

 

    CDCGetDC() { return m_bMemDC ? m_dcMem : m_dc; }

    BOOL IsMemDC() const { return m_bMemDC; }

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

 

protected:

    CDCm_dc;

    BOOL m_bMemDC;

    HANDLE m_hBufferedPaint;

    CDC m_dcMem;

    CBitmap m_bmp;

    CBitmapm_pOldBmp;

    CRect m_rect;

};

 

使用方法:

 

// 1、响应WM_ERASEBKGND消息,返回FALSE,这样就不擦除背景了

BOOL CDemoView::OnEraseBkgnd(CDCpDC)

{

    return FALSE;

}

// 2、在需要作图的地方使用CMemDC。

void CDemoView::OnDraw(CDCpDC)

{

    CGestureDemoDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

 

    CMemDC dcMem(*pDCthis);

    CDCdc = 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

    CBitmapm_oldBitmap// bitmap originally found in CMemDC

    CDCm_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(CDCpDC)

    {

        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(pDCm_rect.Width(), m_rect.Height());

            m_oldBitmap = SelectObject(&m_bitmap);

 

            SetMapMode(pDC->GetMapMode());

            pDC->DPtoLP(&m_rect);

            SetWindowOrg(m_rect.leftm_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_rectpDC->GetBkColor());

    }

    // TRK begin

public:

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

    CMemDC(CDCpDCconst RECTrect) : 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.leftm_rect.topm_rect.Width(), m_rect.Height(),

                thism_rect.leftm_rect.topSRCCOPY);

 

            //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

    CMemDCoperator->()

    {

        return this;

    }

 

    // Allow usage as a pointer

    operator CMemDC*()

    {

        return this;

    }

};

#endif

 

使用方法类同前面所述:

    ///

    // How to use:

    ///

    // 1、响应WM_ERASEBKGND消息,返回FALSE,这样就不擦除背景了

    BOOL CDemoView::OnEraseBkgnd(CDCpDC)

{

        return FALSE;

}

///

// 2、在需要作图的地方使用CMemDC。

void CDemoView::OnDraw(CDCpDC)

{

        CFont font;

        font.CreateFontIndirect(&m_lf);

        CMemDC pMemDC(pDC);

        CFontoldfont = pMemDC->SelectObject(&font);

        //..Draw something here.

        pMemDC->SelectObject(oldfont);

}

///

// 别忘了加include头文件!

///

添加文件"memdc.h"到工程目录里,同时在视类PlantRecognitionView.cpp里添加#include "memdc.h",这样就可应用这个新类了。

在VS2010中,已经包含了类CMemDC,应用这个文件时,会出"error C2011: "CMemDC":"class"类型重定义"。这是提示重复定义,可以将memdc.h里面的CMemDC改成CMyMemDC,然后,将memdc.h里面用到的CMemDC也改成CMyMemDC,这样就不冲突了!


该文章转载自:http://shitou7630.blog.163.com/blog/static/32699536201411995710963/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值