Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » CMemDC - Memory Leak?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.07.2004, 13:41 Uhr
~Alerion
Gast


Hi!

Vielleicht kann mir jemand helfen. Ich hab zum Zeichnen auf einer Dialogbox CMemDC von Keith Rule benutzt. http://cvs.sourceforge.net/viewcvs.py/emuleplus/src/MemDC.h?rev=1.3 Allerdings scheine ich da irgendwo was nicht freizugeben, denn der Compiler meldet ein Memory Leak.

Mein Code:

C++:
// RTS.cpp: Implementierungsdatei
//

#include "stdafx.h"
#include "frame.h"
#include "frases.h"

#include "RTS.h"
#include "CMemDC.h"
#include <afxwin.h>
#include <stdlib.h>
#include <malloc.h>



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// Dialogfeld RTS


RTS::RTS(CWnd* pParent /*=NULL*/)
    : CDialog(RTS::IDD, pParent)
{
    m_pParent = NULL;

  //{{AFX_DATA_INIT(RTS)
        // HINWEIS: Der Klassen-Assistent fügt hier Elementinitialisierung ein
    //}}AFX_DATA_INIT
}


void RTS::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(RTS)
        // HINWEIS: Der Klassen-Assistent fügt hier DDX- und DDV-Aufrufe ein
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(RTS, CDialog)
    //{{AFX_MSG_MAP(RTS)
    ON_WM_DRAWITEM()
    ON_WM_PAINT()
    ON_WM_SHOWWINDOW()
    ON_WM_SIZE()
    ON_WM_VSCROLL()
    ON_WM_HSCROLL()
    ON_WM_MOUSEWHEEL()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten RTS

RTS::~RTS()
{

}

BOOL RTS::OnInitDialog()
{                                
  CDialog::OnInitDialog();
}
          

void RTS::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
    
    CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);

}

void RTS::OnPaint()
{
    CPaintDC dc(this); // device context for painting
        {
        CRect    actual ;
        m_pParent->GetDlgItem (IDC_STAT_TSB)->GetClientRect (&actual);
    GetClientRect(&actual);
        CMemDC    mdc(&dc, actual) ;

    CRect Rect;

    // Bemale Hintergrund weiß

        CPen    whitePen(PS_SOLID, 1, RGB(255, 255, 255)) ;

        mdc.SaveDC() ;

        CPen *pOld = mdc.SelectObject(&whitePen) ;

        mdc.Rectangle(actual) ;

        mdc.SelectObject(pOld) ;
        VERIFY(whitePen.DeleteObject()) ;    

        // get the current scroll positions for correct paint operations
        int x_offset = GetScrollPos(SB_HORZ) ;
        int y_offset = GetScrollPos(SB_VERT) ;

        // offset the window by the scroll amount to get correct drawing
        mdc.SetWindowOrg(CPoint(x_offset, y_offset)) ;


/* Für Frage unwichtiger Code*/

    // Zeichenroutine Zyklusnummern
    CString Nummer;
    Nummer.Format("%d", m_pDaten[0].sCycleCounter);
    RECT *pErstesRect;
    RECT ErstesRect;
    ErstesRect.left = 30;
    ErstesRect.top = 30 + j*20;
    ErstesRect.right = 30 + 50;
    ErstesRect.bottom = 45 + j*20;
    pErstesRect = &ErstesRect;
    mdc.DrawText(Nummer, pErstesRect, DT_NOCLIP);
  
    // Zeichenroutine  Rechtecke
      for (iRegister = 0; iRegister < FrmeCount; iRegister++)
      {
      

      if (iRegister > 0)
      {
        if (m_pDaten[iRegister].sCycleCounter - m_pDaten[iRegister-1].sCycleCounter == 0)
        {
        }

        
        if (m_pDaten[iRegister].sCycleCounter - m_pDaten[iRegister-1].sCycleCounter == Schritt)
        {
          j++;
          Nummer.Format("%d", m_pDaten[iRegister].sCycleCounter);
          RECT *pTextRect;
          RECT TextRect;
          TextRect.left = 30;
          TextRect.top = 30 + j*20;
          TextRect.right = 30 + 50;
          TextRect.bottom = 45 + j*20;
          pTextRect = &TextRect;
          mdc.DrawText(Nummer, pTextRect, DT_NOCLIP);
        }
            
        if (m_pDaten[iRegister].sCycleCounter - m_pDaten[iRegister-1].sCycleCounter > 1000000)
        {
          j++;
          Nummer.Format("%d", m_pDaten[iRegister].sCycleCounter);
          RECT *pTextRect;
          RECT TextRect;
          TextRect.left = 30;
          TextRect.top = 30 + j*20;
          TextRect.right = 30 + 50;
          TextRect.bottom = 45 + j*20;
          pTextRect = &TextRect;
          mdc.DrawText(Nummer, pTextRect, DT_NOCLIP);

        }
        if (m_pDaten[iRegister].sCycleCounter - m_pDaten[iRegister-1].sCycleCounter != 0 &&
            m_pDaten[iRegister].sCycleCounter - m_pDaten[iRegister-1].sCycleCounter != Schritt &&
            m_pDaten[iRegister].sCycleCounter - m_pDaten[iRegister-1].sCycleCounter < 10000)
        {
          // Behandlungsroutine Fehler fehlt!
          Fehler++;
        }
          
      
      }

      // Berechnung ob Frame hinten angefügt wird oder neue Zeile benötigt wird
        if (j == letztesJ)
      {
        iReg++;
      }
  
      else
      {
        iReg = 1;
        letztesJ = j;
        anfangReg = iRegister;
      }
  
      // Zeichenroutine Zeittelegramme
          if (m_pDaten[iRegister].sFrameID <= 255)
          {
        
              RECT MyRect;
              MyRect.left = 85 + (iReg - 1) * (long)((m_pDaten[iRegister].sTimeStamp - m_pDaten[anfangReg].sTimeStamp) * size / (gesamtLaenge - 170)) ;
              MyRect.top = 30 + j*20 ;
              MyRect.bottom = 45 + j*20;
              MyRect.right = (long)(MyRect.left + 5000 * size / gesamtLaenge);
  
              CBrush brush2;
  
              brush2.CreateSolidBrush(RGB (0,0,0));        
              mdc.FrameRect( &MyRect, &brush2);        
          }
          
              
      
      }
    Nummer.Format("%d", Fehler);
    RECT *pTextRect;
    RECT TextRect;
    TextRect.left = 30;
    TextRect.top = 30 + (j+1)*20;
    TextRect.right = 30 + 50;
    TextRect.bottom = 45 + (j+1)*20;
    pTextRect = &TextRect;
    mdc.DrawText(Nummer, pTextRect, DT_NOCLIP);


        mdc.RestoreDC(-1) ;

    
        }// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen
    
    // Kein Aufruf von CDialog::OnPaint() für Zeichnungsnachrichten
}

void RTS::OnShowWindow(BOOL bShow, UINT nStatus)
{
    CDialog::OnShowWindow(bShow, nStatus);
    
    // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen
    
}

void RTS::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    
}

void RTS::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    
}


void RTS::OnSize(UINT nType, int cx, int cy)
{

}
  
BOOL RTS::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
    // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
    
    return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}




Ich hoffe mal, ich hab jetzt nix notwendiges weggelöscht und die Klammern stimmen noch, aber der Code war vorher zu lang.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.07.2004, 16:22 Uhr
~Thales
Gast


Du solltest in Zeile 127 nicht mit einem * sondern mit & arbeiten, dann funzt es.


Spass beiseite - ohne den Quelltext bzw. die Deklaration von CMemDC wirst Du wohl nicht allzu viel Hilfe bekommen...

Gruß

Thales
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.07.2004, 23:22 Uhr
~Siran
Gast


Der Link oben geht auf die Headerdatei von CMemDC. Mehr ist ja gar nicht vorhanden. Ich wollte bloß den doch relativ langen Code nicht nochmal komplett abschreiben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: