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: kei...@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
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
> Daher jetzt die Frage: benutzt VS 2010 automatisch ein eigenes CMemDC,
> so dass man sich die ursprüngliche Lösung schenken kann?
Lesetip:
<http://blog.m-ri.de/index.php/2010/11/06/erstaunen-cmemdc-ist-bestandte
il-der-mfc/>
Tschau - Robert
--
vertrau
voraus voraus