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