Parameter eine CPen Objekt nachträglich ändern??



  • Habe folgendes:

    CPen cpKoord;
    
    cpKoord.CreatePen(PS_GEOMETRIC,1,RGB(0,0,0));
    
    CPen *pPenOld; //Buf
    // Neu Stift zuweisen
    pPenOld = oDC.SelectObject(&cpKoord);
    
    // Line etc. zeichen
    
    .
    .
    
    //
    oDC.SelectObjectp(pPenOld);
    
    // <------ Hier möchte ich nur die Linen dicke ändern im cp Koord
    
    // Neu Stift zuweisen
    pPenOld = oDC.SelectObject(&cpKoord);
    
    // Neue Line nur dicker zeichnen
    .
    .
    
    oDC.SelectObjectp(pPenOld);	
    cpKoord.DeleteObject();
    

    geht das?? will halt nur ein CPen objekt und nich extra für die lgeiche line und dicker ein neies CPen Objekt anlegen.. zudem wrid das cpKoord schon früh im Kontruktro der klasse angelegt und will es später in einer Funktion ändern..

    geht das???


  • Administrator

    Direkt im CPen nicht, aber im LOGPEN schon. Folgendes bietet sich deshalb hier an:

    LOGPEN lgPen;
    CPen MyFirstPen, MySecondPen;
    
    lgPen.lopnStyle = PS_GEOMETRIC;
    lgPen.lopnWidth = 1;
    lgPen.lopnColor = RGB(0, 0, 0);
    
    MyFirstPen.CreatePenIndirect(&lgPen);
    
    CPen* pOldPen = pDC->SelectObject(&MyFirstPen);
    
    // ... Zeichnen ... //
    
    // Dickere Linie.
    lpPen.lopnWidth = 10;
    
    MySecondPen.CreatePenIndirect(&lgPen);
    
    pDC->SelectObject(&MySecondPen);
    
    // ... Zeichnen ... //
    
    // Aufräumen ...
    pDC->SelectObject(pOldPen);
    MyFirstPen.DeleteObject();
    MySecondPen.DeleteObject();
    

    Du kannst den LOGPEN auch holen über CPen::GetLogPen(...). Schau einfach mal in der MSDN nach 😉

    Ich hoffe ich konnte helfen!
    Grüssli



  • hey super.. das ist sieht gut aus;)



  • Hallo ich habe das gleiche Problem. Ich würde gerne die Parameter eines CPen-Objekts nachträglich ändern. Auf der Suche nach einer Lösung habe ich diese Einträge hier gefunden, bin allerdings mit dem Lösungsansatz nicht wirklich zufrieden.

    Mein Wunsch besteht darin, keinen neuen CPen erstellen zu müssen. Genau das geschieht aber in dem Lösungsvorschlag. Lediglich die LOGPEN-Struktur wird wiederverwendet, um das Erstellen des zweiten Pens zu vereinfachen. Ich möchte aber mit ein und demselben Pen verschieden dicke Linien zeichnen. Meine bisherige Lösung besteht darin, nach dem Ändern der LOGPEN-Struktur folgendes aufzurufen:

    MyPen.Detach();
    MyPen.CreatePenIndirect(&MyLogPen);
    pDC->SelectObject(&MyPen);

    Finde ich immer noch nicht sehr elegant und ich verstehe nicht, warum ich SelectObject nocheinmal aufrufen muss. Der Zeiger auf Pen sollte sich ja nicht geändert haben.

    Hat jemand eine Idee oder Erklärung ?

    Danke


  • Mod

    Das geht nicht! Ein Pen wird mit bestimmten Eigenschaften erzeugt, die er behält.

    BTW: Übergeben wird immer nur ein Handle. Und man erhält ein neues Handle wenn man einen alten Pen lösche (DeleteObject) und einen neuen erzeugt. Das Pen Objekt enthält dann ein anderes GDI Objekt.


Anmelden zum Antworten