CEditCtrl: Schrift-Attribute merken, aber wie?



  • Hallo Leute.

    Ich habe folgendes Problem:

    Es existiert ein Edit-Feld auf einem Dialog.
    Da ich mir eine "Error-Schrift" mittels eines CFont-Objektes kreeirt habe, möchte ich mir die "Standard"-Schrift (die zu Programmstart benutzte) merken können, bevor ich nun die Error-Schriftart zuweise.

    Ich bekomm aber verdammt nochmal nicht die Schrift in meine Member CFont m_StdSchrift.

    Gibt es eine Möglichkeit dem EditCtrl eine LOGFONT-Struktur zu entlocken?

    Vielen Dank.

    Gruß, Sven



  • Na warum denn nicht

    CFont* font = pWnd->GetFont(); //pWnd ist ein Zeiger auf dein Edit
    if (font)
    {
       LOGFONT lf;
       font->GetLogFont(&lf);
       TRACE("Typeface name of font = %s\n", lf.lfFaceName);
    }
    

    mal aus der MSDN geklaut



  • Ach herrje, so einfach ist das?
    Da bin ich ja die ganz falschen Wege gegangen. 😮

    Vielen Dank!!! 👍

    P.S. Ich habe auch probiert über die MSDN zu einer Lösung zu kommen. Wo stand das denn?



  • na schaue unter CFont -> GetLogFont()

    http://msdn.microsoft.com/en-us/library/zhcs623h(VS.71).aspx

    das is sozusagen die rückwärtssuche 😃



  • Oh nein, ich seh grad, dass es auf meiner lokalen MSDN ja auch steht.
    Ich brauch wohl mal ne Brille. 😃

    [EDIT]

    BTW, es klappt soweit auch ganz gut, nur ...

    Wenn ich dem EditCTRL einmal per als Schriftdicke FW_SEMIBOLD (lfWeight = 600) mitgegeben habe, dann bekomme ich des nicht mehr zurück gestellt.

    Per Debugger kann ich sehen, dass bei einer Neuzuweisung SetFont(&font) das Objekt eine Schriftdicke von FW_NORMAL (lfWeight = 400) enthält.

    Leider übernimmt mein EditControl dies nicht.

    Machen möchte ich das so:

    Dlg.h

    [cpp]CFont m_StdErrorFont;[/cpp]
    

    Dlg.cpp

    [cpp]
    // Merken bei Aufbau des Dialogs
    OnInitDialog
    {
            CFont* font = m_ctrlInputError.GetFont();
    	if(font)
    	{
    		LOGFONT lf;
    		font->GetLogFont(&lf);
    		m_StdErrorFont.CreateFontIndirect(&lf);
    	}
    }
    
    // Entweder Fehler-Schrift (dicker) oder das Gemerkte nutzen
    SetFontForErrors()
    {
    	CFont font;
    	LOGFONT lf;
    
    	m_StdErrorFont.GetLogFont(&lf);
    
    	if(m_dwColor == RGB_RED)	
    	{
    		lf.lfWeight = FW_SEMIBOLD;
    	}
    	font.CreateFontIndirect(&lf);
    	m_ctrlInputError.SetFont(&font);
    }
    [/cpp]
    

    Zu Beginn also einmal die Start-Schrift merken und dann bei Bedarf nur die Dicke ändern oder aber einfach das Gemerkte nehmen.
    Funzt nicht. 😞
    Und nein, ich mache erst die Zuweisung des Font-Objektes und dann schreibe ich mit m_ctrlInputError.SetWindowText() einen String hinein.



  • Ich hab folgende Zeile umgeändert:

    [cpp]font.CreateFontIndirect(&lf); [/cpp]
    

    ist nun

    [cpp]VERIFY(font.CreateFontIndirect(&lf));[/cpp]
    

    Die Zuweisung scheint eigentlich zu klappen, denn der Rückgabewert ist nicht 0 oder NULL.

    😕 😕 😕


  • Mod

    Dein CFont Objekt is lokal in der Funktion. D.h. es wird sofort wieder zerstört, wenn die Funktion verlassen wird.
    Du musst das CFont Objekt solange erhalten wie es Child Windows gibt, die diesen Font verwenden.

    Hatten wir doch gerade erst hier im Forum... 👎



  • Ups, wie peinlich. 😞



  • Fiesek schrieb:

    Ups, wie peinlich. 😞

    Kein Einspruch! 😉


Anmelden zum Antworten