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:1120Durch'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ß