Zeichnen einer figur



  • hallo ich habe ein spiel in dem ich eine figur zeichne das mache ich so

    void spiel2::figur3(int x, int y)
    {
        CClientDC dc(this);
        CBrush *pinsel3= new CBrush(m_figurcolor3);
    
        dc.SelectObject(pinsel3);
        dc.Ellipse((m_feldposx3 + ((x - 1) * m_feldx3 + 2)),
            (m_feldposy3 + ((y - 1) * m_feldx3 + 2)),
            (m_feldposx3 + (x * m_feldx3 - 2)),
            (m_feldposy3 + (y * m_feldx3 - 2)));
    
        delete pinsel3;
    
        changecoord3(x, y);
    }
    

    ich möchte aber jetzt das die figur einen weißen rand bekommt das geht glaub ich irgendiwe mit CPen aber ich weiß nicht genau wie kann mir das eventuell jemand sagen??
    Danke schonmal im voraus





  • Zitat aus Dinner 4 One:

    'The same procedure as every year, james!'

    CPen erstellen, CPen selektieren, zeichnen!

    Aber mal davon abgesehen, ich bin mir sicher, Du hast auch schon öfter gesehen, wie Objekte in einen DC selektiert werden und wie die Aufräumarbeiten vorzunehmen sind. Wieso also hier schon wieder fehlerhaften Code posten?



  • Ja, es gibt da auch die FAQ, und wenn du mal oben rechts schaust,
    wirst du sogar einen Link zur Suchfunktion des Boards finden...

    Devil



  • @ ReneG
    wieso denn fehlerhafter code? was ist denn daran falsch?



  • Du löschst ein Objekt was vom DC noch Selctiert ist.
    Das kann dann zu Zugriffsverletzungen führen, da ja das Objekt
    nicht mehr vorhanden ist, der DC aber immer noch denkt er könne drauf zugreifen...

    Devil



  • @ devil81

    kannst du mir bitte bitte sagen bzw zeigen wie es richtig geht?
    Denn das könnte das problem für meinen einen fehler sein.
    Bin noch anfänger weißt du deshalb weiß ich das nicht so genau



  • @devil81
    Das ist falsch!
    Das GDI-Objekt wird im DC selektiert. Bei GDI-Objekten handelt es sich um globale Objekte. Beim Löschen des Handles bekommt das GDI-Objekt mit, dass es noch verwendet wird und löscht sich selber somit nicht. Der Verweis auf das Objekt allerdings verschwindet, so dass man nicht mehr die Möglichkeit hat, es noch zu löschen.



  • ok ok ok.
    ich habes jetzt so gemacht

    CClientDC dc(this); 
    CBrush *pinsel3= new CBrush(m_figurcolor3); 
    CBrush *oldBrush; 
    
    oldBrush = dc.SelectObject(pinsel3); 
    
    dc.Ellipse((m_feldposx3 + ((x - 1) * m_feldx3 + 2)), 
            (m_feldposy3 + ((y - 1) * m_feldx3 + 2)), 
            (m_feldposx3 + (x * m_feldx3 - 2)), 
            (m_feldposy3 + (y * m_feldx3 - 2))); 
    
    dc.SelectObject(oldBrush); 
    delete pinsel3; 
    
        changecoord3(x, y);
    

    könntet ihr mir jetzt trotzdem sagen wie das mit cpen funktioniert



  • Wer suchet der Findet.

    Devil


Anmelden zum Antworten