Recourse

kerian

Erfahrenes Mitglied
Hallo, kann mir jemand villeicht sagen, warum er die Recourse verliert
Ist doch alles da oder nicht ?
Der nachfolgende Code befindet sich in
Code:
void CGR2Button::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

Code:
/*	  CBrush *pBtnBrush;
	  pBtnBrush = new CBrush(RGB(77, 70, 255));

	  CDC dc;
	  dc.Attach(lpDrawItemStruct->hDC);     //Get device context object

	  CRect CBtnRect(&lpDrawItemStruct->rcItem);        //Get button rect
	  dc.SelectObject(pBtnBrush);
	  dc.FillSolidRect(CBtnRect, RGB(60, 60, 255));
  
	  if(m_alarm)
	  dc.FillSolidRect(lpDrawItemStruct->rcItem, RGB(255, 60, 60));
	  else
	  dc.FillSolidRect(lpDrawItemStruct->rcItem, RGB(60, 60, 255));
  
	  UINT state = lpDrawItemStruct->itemState; // Get state of the button
	  if ( (state & ODS_SELECTED) )             // If it is pressed
	  {
		dc.DrawEdge(CBtnRect,EDGE_SUNKEN,BF_RECT);    // Draw a sunken face
	  }
	  else
	  {
		dc.DrawEdge(CBtnRect,EDGE_RAISED,BF_RECT);    // Draw a raised face
	  }


	  if ( (state & ODS_FOCUS ) )       // If the button is focused
	  {
		// Draw a focus rect which indicates the user 
		// that the button is focused
		int iChange = 3;
		CBtnRect.top += iChange;
		CBtnRect.left += iChange;
		CBtnRect.right -= iChange;
		CBtnRect.bottom -= iChange;
		dc.DrawFocusRect(CBtnRect);
	  }

	  CString str1, str2, str3;
	  str1 = m_bezeich; 
	  dc.SetBkMode(TRANSPARENT);
	  dc.SetTextColor(RGB(10,255,10));
	  dc.TextOut(10,5,str1);  



	  delete pBtnBrush;
	  dc.Detach();
*/
 
AFAIK werden Brushs, Pens und Konsorten nicht komplett gezappt, wenn die in einen DC selektiert sind. Bewahre dir den Rückgabewert vom SelectObject auf und bevor du den Brush wieder tötest, selektierte wieder das alte Objekt rein.
 
:) kaum zuglauben aber es geht :)
:eek:
Gesagt getan
Code:
 CBrush *pBtnBrush;
CBrush * pOldBtnBrush;
..
..
..
pOldBtnBrush = dc.SelectObject(pBtnBrush);
..
..
..
 dc.SelectObject(pOldBtnBrush);
..
..
pOldBtnBrush = NULL;
pBtnBrush = NULL;
delete pBtnBrush;
delete pOldBtnBrus;
Ich habe den dann in dem Pointer gerettet und wieder reinselektiert.

zum Schluß habe ich dann beide Pionter auf NULL gesetzt und deleted!
Und das war ein Fehler. Wenn ich den pOldBtnBrush nicht lösche läuft es!

Code:
..
..
delete pBtnBrush;
dc.Detach();
Aber warum
 
Zuletzt bearbeitet:
delete und new sollten immer ein Pärchen bilden, d.h. du kannst nur solche Speicherbereiche mit delete wieder freigeben, die vorher mal mit new angelegt hast. Im Fall von "delete pOldBtnBrush;" ziehst du sozusagen dem System an irgendeiner Stelle den Boden unter den Füßen weg, weil du einen "fremden" Speicherbereich killst.
 
Zurück