Gerätekontext (SelectObject und Selectstockobject)

LukeS

Erfahrenes Mitglied
Hallo zusammen
Ich habe folgende Funktione aus einem Projekt aus MFC-Buch.

Code:
void CMyDrawView::SetPenBrush(CDC *pDC, bool bTransparent, UINT nColor)
{
	ASSERT(pDC != NULL);
	if(bTransparent)
	{
		// Figuren transparent darstellen
		m_pBrushOld = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
	}
	else
	{
		m_pBrushOld = (CBrush*)pDC->SelectStockObject(WHITE_BRUSH);
	}
	ASSERT(m_pBrushOld != NULL);

	// einen neuen Stift erstellen
	ASSERT(nColor - ID_FARBE_SCHWARZ >= 0 &&
			nColor - ID_FARBE_SCHWARZ <=
				(sizeof(arColors) /sizeof(arColors[0])));
	// Stiftobjekt auf dem Heap erstellen
	m_pPenNew = new CPen();
	// den GDI-Stift erstellen und mit dem Gerätekontext (DC) verknüpfen
	m_pPenNew->CreatePen(PS_INSIDEFRAME, 0, arColors[nColor - ID_FARBE_SCHWARZ]);
	m_pPenOld = (CPen*)pDC->SelectObject(m_pPenNew);
	// Gerätekontext wird mit der Funktion ResetPenBrush wieder hergestellt

}

Nun habe ich eine Frage zu folgenden Zeilen:
Code:
m_pBrushOld = (CBrush*)pDC->SelectStockObject(NULL_BRUSH)
Code:
m_pBrushOld = (CBrush*)pDC->SelectStockObject(WHITE_BRUSH);
Code:
m_pPenOld = (CPen*)pDC->SelectObject(m_pPenNew);

In all diesen Programmzeilen will ich den alten Zustand des Pinsels oder Stiftes speichern .
Doch auf der rechten Seite der Zuweisung setze ich ja den neuen Pinsel/Stift. Wesshalb wird dann trotzdem der alte Pinsel/Stift in m_pBrushOld bzw. m_pPenOld gespeichert.
Der Zuweisungsoperator (=) wird doch in diesen Zeilen zuletzt ausgeführt.

Übrigens werden die Variablen m_pBrushOld und m_pPenOld in einer Funktion zum zurücksetzen der Gerätekontexts verwendet.

Ich danke euch schon im Voraus für eure Hilfe.
Gruss LukeS
 
LukeS hat gesagt.:
Der Zuweisungsoperator (=) wird doch in diesen Zeilen zuletzt ausgeführt.
Das ist schon richtig, aber zuerst wird ja die Methode bzw. die darin aufgerufene API-Funktion ausgeführt. Die sichert erst das vorhandene Zeichenobjekt und verwendet dann erst das Neue. Somit kann das alte Zeichenobjekt (bzw. der Zeiger darauf) als Rückgabewert verwendet werden.

Gruß
MCoder
 
Vielen Dank für die Antwort! Jetzt verstehe ich auch einigermassen den englischen Text aus der Visual C++ Hilfe zu den zwei Methoden (SelectObject und SelectStockObject). Mir ist nur nicht ganz klar, wann ich welche dieser zwei Methoden verwenden soll.

Gruss LukeS
 
Mit SelectStockObject() verwendest du bereits vordefinierte Zeichenobjekte verwenden, während mit SelectObject() selbst definierte Objekte verwendet werden:
Code:
CBrush *pOldBrush = SelectStockObject(BLACK_BRUSH); // BLACK_BRUSH ist schon definiert


CBrush brush;
brush.CreateSolidBrush(RGB(0,0,0)); // selbst definierter (schwarzer) Brush
CBrush *pOldBrush = SelectObject(&brush);
Gruß
MCoder
 
Jetzt ist's klar...
Ein Steinchen mehr im Puzzle, das Sinn macht...

Danke vielmals

P.S: Ich weiss nicht, ob es nur am mir liegt (ich denke ich bin nicht gerade ein sehr begabter Programmierer)... aber ich habe das Gefühl, dass die MFC (und Win32-API) ziemlich kompliziert aufgebaut sind. Doch wahrscheinlich braucht es einfach eine gewisse Zeit, um sich einzuarbeiten und dann macht der Aufbau mehr Sinn.
 
Zurück