CBrush Problem



  • Hallo,

    ich habe gerade ein komisches CBrush Problem und hoffe das vielleicht jemand hier einen Tipp hat 😕

    void draw(CDC * pDC)
    {
      CBrush * pBrush = NULL;
    
      pBrush = func(pDC);
    
      // ...
    }
    

    Hier der schmatische Code. Warum ich das auslagern möchte aus der draw Methode ist weil die func methode eigentlich viel größer ist und es da eine auswahl über mehrere brushes geben soll.

    CBrush * func(CDC * pDC)
    {
      CBrush * pBrush = NULL;
      CBrush  a;
      a.CreateSolidBrush(RGB(255, 0,0));
    
      pBrush = pDC->SelectObject(&a);
    
      return pBrush;
    }
    

    In der func Methode bekomme ich noch einen gültigen Wert für die Brush, allerdings in der Return Methode kommt mit dem return dann eine fehlerhalft brush zurück (0xcccc).
    Weiß jemand wieso das so ist, bzw. was muss ich machen, damit es funktioniert?

    Vielen Dank, Lg



  • Du solltest vielleicht dafür sorgen, daß der erzeugte Brush so lange überlebt, wie du damit arbeiten willst - der "CBrush a;" ist lokal in der Funktion und wird direkt nach der return-Anweisung zerstört - allerdings arbeitest du danach fleißig mit der Adresse dieses (nicht mehr existierenden) Objekts.



  • Es ist noch wirrer. Es wird ja der Rückgabewert von SelectObject zurückgegeben. Das ist der Brush, der vorher im DC selektiert war (für den dann aber wohl auch gilt, was CStoll gesagt hat).



  • danke erstmal für die Antworten !

    ganz genau weiß ich allerdings jetzt nicht was ihr meint.
    Soll ich ein neues Objekt für die Brush a anlegen?



  • So ungefähr: Du solltest deinen Brush a an einer Stelle unterbringen, wo er das Ende der Funktion überleben kann. (zum Beispiel könntest du alle Brush's, die du verwenden willst, in der Klasse sammeln)

    PS: Was hast du eigentlich mit dem zurückgegebenen Brush vor?



  • warum ich ihn zurück geben muss/will ist folgender:
    nach der Rückgabe zeichne ich mit dem DC noch diverse sachen und am Ende der Methode muss man ja anscheind folgendes machen

    pDC->SelectObject(pBrush); // zurückgegebende Brush
    

    für den Fall das ich zwischenzeitlich den DC verändert habe und/oder danach wieder mit der vorherigen BRush weiterzeichnen möchte.

    Ich könnte natürlich auch alles in der einen Methode lassen (so wie es funktioniert), aber das macht die Methode einfach nur lang und übersichtlich, deshalb wollte ich das mit einer Extra Funktion lösen.


Anmelden zum Antworten