C++ VS 2010 - CMemDC

16/12/2010 - 00:29 von Ernst.Sauer | Report spam
Hallo,

Seit vielen Jahren habe ich CMemDC (Author: Keith Rule) verwendet,
die Header-Datei habe ich unten angehàngt.

In cEbraView.cpp steht bei mir

//
#include "memdc.h" // siehe unten
...
void CCEbraView::OnDraw(CDC* dc)
{ ...
CMemDC pDC(dc);
...
}
//

Mit VS 2010 bekomme ich jetzt folgende Fehlermeldung:

1>nafxcw.lib(afxglobals.obj) : error LNK2005: "public: virtual
__thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) ist bereits in
cEbraView.obj definiert.

Im Internet habe Beitràge zu dieser Fehlermeldung gelesen,
aber leider keine klare Lösung.


Danke für einen Tipp
Ernst Sauer





//--
#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; }

// von mir

void Bild(void)
{ m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(),
m_rect.Height(), this, m_rect.left, m_rect.top, SRCCOPY);
}

};

#endif
 

Lesen sie die antworten

#1 Ernst.Sauer
16/12/2010 - 00:47 | Warnen spam
Hat sich erledigt, man muss nur CMemDC durch CMemDC2 ersetzen,
dann geht es.

Daher jetzt die Frage: benutzt VS 2010 automatisch ein eigenes CMemDC,
so dass man sich die ursprüngliche Lösung schenken kann?


Nàchtlicher Gruß
Ernst Sauer

Ähnliche fragen