Font von CListBoxCtrl zur Laufzeit mit CFontDialog ändern



  • Hallo zusammen,

    ich möchte die Schriftart einer CListBoxCtrl per CFontDialog ändern.
    Ich hab es so versucht:

    void CMyDlg::OnSetFontBtn() 
    {
    	LOGFONT lf;
    	m_LogListBoxCtrl.GetFont()->GetLogFont(&lf);
    	CFontDialog dlg(&lf);
    	if (dlg.DoModal() == IDOK)
    	{
    		CFont Font;
    		Font.CreateFontIndirect(&lf);
    		m_LogListBoxCtrl.SetFont(&Font,true);
    	}
    }
    

    die Schriftart wird auch geändert, aber die neue Schriftart entspricht nicht der ausgewählten (sieht nach dem vestellen immer gleich aus).
    Kann mir jemand weiterhelfen?



  • Also wenn ich mich recht entsinne dient der Pointer auf die LOGFONT-Struktur im Konstruktor von CFontDialog nur der initialisierung. Du kannst dir den LOGFONT aus dem Dialog so holen...

    LOGFONT lf;
    memcpy(&lf, dlg.m_cf.lpLogFont, sizeof(LOGFONT));
    


  • Ehm, bist du sicher, dass SetFont einen Pointer auf eine lokale Variable erwartet???



  • Vielen Dank,

    das mit der lokalen Variable war natürlich blöd von mir. 😕

    so funktioniert es jetzt:

    void CMyDlg::OnSetFontBtn() 
    {
    	LOGFONT lf;
    	CFont* pFont;
    	pFont = m_LogListBoxCtrl.GetFont();
    	pFont->GetLogFont(&lf);
    	CFontDialog dlg(&lf);
    	if (dlg.DoModal() == IDOK)
             {
    		pFont->CreateFontIndirect(&lf);
    		m_LogListBoxCtrl.SetFont(pFont,true);
    	}
    }
    

    auch wenn im Debugmodus eine Debug Assertion Failed bei dem erneuten CreateFontIndirect ausgegeben wird.



  • auch wenn im Debugmodus eine Debug Assertion Failed bei dem erneuten CreateFontIndirect ausgegeben wird

    Sicherlich kann ich mich auf einen Platz im Bus setzen, auf den sich gerade eine ältere Oma setzen wollte. Aber das tangiert mich nur peripher ...



  • [quote]...den sich gerade eine ältere Oma setzen wollte
    [\quote]

    bei der Oma hätte ich Skrupel, hier nicht 🤡


Anmelden zum Antworten