Debug Assertion Failed bei versuchter Schriftgroessen aenderung



  • Hallo alle zusammen.

    Ich habe eine Frage bzw. ein Problem in Bezug auf die Aenderung der Groesse eines Textes in meinem Dialog!

    Ich stelle einen Text auf eine bestimmte Groesse ein und moechte sie dann mit hilfe von 2 buttons groesser, bzw. kleiner machen. Hier der Code

    int CMessagebox::Fontini(Fontheight){ //wird anfangs mit Fontini(30) aufgerufen
      m_pFont = m_ctrMsgetextcontrol.GetFont(); //hole Font vom Text
      LOGFONT lf;
      m_pFont->GetLogFont(&lf);  //Font to Logfont
      lf.lfHeight = Fontheight;  //Groesse setzen
      m_fontMsgText.CreateFontIndirect(&lf);  //setze Logfont als Textfont
      m_ctrMsgtextcontrol.SetFont(&m_fontMsgText); //setze Textfont 
      return 0;
    }
    
    void CMessagebox::OnBiggerText(){ //vergroessern des Textes um 5
       m_pFont = m_ctrMsgetextcontrol.GetFont();
      LOGFONT lf;
      m_pFont->GetLogFont(&lf);
      lf.lfHeight += 5;
      m_fontMsgText.CreateFontIndirect(&lf);
      m_ctrMsgtextcontrol.SetFont(&m_fontMsgText);
    }
    
    void CMessagebox::OnSmallerText(){ //verkleinern des Textes um 5
       m_pFont = m_ctrMsgetextcontrol.GetFont();
      LOGFONT lf;
      m_pFont->GetLogFont(&lf);
      lf.lfHeight -= 5;
      m_fontMsgText.CreateFontIndirect(&lf);
      m_ctrMsgtextcontrol.SetFont(&m_fontMsgText);
    }
    

    Beim ausfuehren des Programms kommt beim Click auf den jeweiligen groesser/kleiner Button eine Debug Assertion Failed Meldung!

    FILE:wingdi.cpp
    Line:1120

    Durch's Debuggen weiss ich, dass dies beim erneuten aufruf von .CreateFontIndirect() geschieht.
    In anderen Foren steht, dass das problem mit dem bereits erstellten Objekt m_fontMsgText zusammen haengen koennte. Aber auch ein Einfuegen von DeleteObject in die Funktionen bringt nicht die Loesung...

    Hat jemand eine Idee 😕



  • Ich könnte mit vorstellen das es daran liegt dass der Font schon Created wurde.
    Versuch mal :

    m_pFont = m_ctrMsgetextcontrol.GetFont();
        LOGFONT lf;
        m_pFont->GetLogFont(&lf);
        lf.lfHeight += 5;
        m_pFont->DeleteObject();
        m_pFont->CreateFontIndirect(&lf);
        m_ctrMsgetextcontrol.SetFont(m_pFont);
    

    m_pFont sollte durch dass zuvor ausgeführte Fontini() auf "m_fontMsgText" zeigen.

    Das zuvor Created GDI Object sollte gelöscht werden anschließen kann ein neues GDI Object created werden..

    Bin aber auch nicht zu 100% Fit in dem GDI bereich, hoffe es ist kein Mist was ich hier erzähle 🙂 und es enstehen keine Speicher / Resource Leaks oder sowas..

    Güße
    Marcus



  • enum Fontsize
    {
       Set,
       kleiner,
       groesser
    };
    int CMessagebox::Fontini(int Fontheight,BYTE Set){ // set im header mit 0 als default definieren
      CFont *pFont = m_ctrMsgetextcontrol.GetFont(); //hole Font vom Text
      LOGFONT lf;
      pFont->GetLogFont(&lf);  //Font to Logfont
      switch(Set)
      {
         case Set:
            lf.lfHeight = Fontheight;  //Groesse setzen
         case kleiner:
            lf.lfHeight -= Fontheight; //verkleinern des Textes
         case groesser:
            lf.lfHeight += Fontheight; //vergrößern des Textes
      }
      m_fontMsgText.DeleteObject();  //Font erst zerstören bevor er neu erstellt wird
      m_fontMsgText.CreateFontIndirect(&lf);  //setze Logfont als Textfont
      m_ctrMsgtextcontrol.SetFont(&m_fontMsgText); //setze Textfont 
      return 0;
    }
    
    void CMessagebox::OnBiggerText(){ //vergroessern des Textes um 5
       Fontini(5,groesser);
    }
    
    void CMessagebox::OnSmallerText(){ //verkleinern des Textes um 5
       Fontini(5,kleiner);
    }
    

    So mal mein vorschlag zum Thema, und ja du mußt zuerst das Font-Objekt zerstören bevor du wieder mit Create ein neues erstellen kannst, das is auch meist das Steckenpferd bei GDI leaks



  • Hey CTecS,

    nachdem ich noch die break ins switch-case geschrieben habe, funktioniert dein Vorschlag wunderbar!

    Vielen Dank



  • Shit ja sorry hatte ich vergessen, war erstens schon net mehr so früh am tag und zweitens sieh als test ob du auch aufpasst.

    Gruß


Anmelden zum Antworten