Schriftart ändern



  • Hallo,

    ich habe schon die Suchfunktion benutzt, aber nichts brauchbares gefunden.
    Wie kann ich in einem Listenfeld die Schriftart ändern. Ich habe es folgendermaßen probiert:

    LOGFONT lf;
    CFont m_font;
    memset(&lf, 0, sizeof(LOGFONT));
    lf.lfHeight=10; 
    strcpy(lf.lfFaceName,"Courier New");
    m_font.CreateFontIndirect(&lf);
    ((CListBox*)GetDlgItem(IDC_LIST_AUSGABE))->SetFont(&m_font);
    

    Leider ohne Erfolg. Er kompiliert alles aber die Schrift ändert sich nicht. Sie wird nur dicker.



  • ist m_font eine Membervariable?



  • Also ich habe jetzt eine Member Variable vom Typ Control Namens m_font auf IDC_LIST_AUSGABE erstellt. Aber es geht immer noch nicht



  • m_font als Membervariable deklarieren, einmal erstellen und dem Control zuweisen...



  • m_font ist bei Dir eine lokale Variable, mach daraus eine Membervariable des Dialoges auf dem Dein Control liegt. SetFont() legt nämlich keine Kopie von CFont an!!!



  • Es geht aber trotzdem noch nicht 😞 Oder habe ich die Membervariable falsch deklar.



  • Und schau mal in die FAQ, da ist es mind. für ein Edit erklärt - funktioniert aber GENAUSO.



  • lol darüber hab ich mir auch die haare gerauft bis ich auf die genial blöde idee kam mir in der OnInitDialog() funktion bevor ich dem listenfeld ne schriftart zuweise mir von diesem ne schriftart zu holen und dann erst neu zuzuweisen.

    ich weis ist bescheuert aber anderst geht es nicht

    LOGFONT lf;
    CListCtrl *pList = new CListCtrl();
    CFont *Font;
    Font->Detach();
    Font = pList->GetFont();
    
    memset(&lf, 0, sizeof(LOGFONT));
    lf.lfHeight=10; 
    strcpy(lf.lfFaceName,"Courier New");
    
    Font->CreateFontIndirect(&lf);
    pList->SetFont(Font)
    

    mfg
    LowFly



  • Jetzt kommt beim comipiliern ein Zugriff auf einen nicht erlaubten Speicherbereich.



  • Jetzt kommt beim comipiliern ein Zugriff auf einen nicht erlaubten Speicherbereich

    wie wenn du es so machst wie ich dir vorgeschlagen hab???
    dann nimm mal anstatt
    CListCtrl *pList = new CListCtrl();

    die variable die du dem Listenelement zugeweisen hast.
    Fals du keine zugewiesen hast dann weis eine zu.

    m_ListCtrl.GetFont();
    m_ListCtrl.SetFont(Font);

    mit zeigern klapt das aber bei mir wunderbar.;)

    mfg
    LowFly


  • Mod

    LowFly schrieb:

    LOGFONT lf;
    CListCtrl *pList = new CListCtrl();
    CFont *Font = pList->GetFont();
    
    memset(&lf, 0, sizeof(LOGFONT));
    lf.lfHeight=10; 
    strcpy(lf.lfFaceName,"Courier New");
    
    Font->CreateFontIndirect(&lf);
    pList->SetFont(Font)
    

    Dieser Code ist Buggy! Du verwendest auf ein bereits erzeigtes Objekt (GetFont), erneut CreateFontIndirect!

    Wie schon erwähnt. Korrekt wäre das anlegen einer Memeber Variable im Dialog.

    Der folgende Code erzeugt einen Bold Font basierend auf dem aktuellen Font und weist diesen zu.

    // Set the text to be bold
    LOGFONT logfont;
    GetFont()->GetObject(sizeof(LOGFONT),&logfont);
    logfont.lfWeight = FW_BOLD;
    if (m_fontBold.CreateFontIndirect(&logfont)) 
    {
    	// Set bold font
    	CWnd *pWnd = GetDlgItem(IDC_CTRL);
    	if (pWnd)
    		pWnd->SetFont(&m_fontBold);
    }
    


  • Dieser Code ist Buggy!

    naja dann frag ich mich warum er bei mir fehlerfrei ohne programmabsturz läuft. 😉



  • Also ich habe es jetzt so probiert:

    CFont newfont;
    
    	LOGFONT lf;
    	GetFont()->GetObject(sizeof(lf),&lf);
    	lf.lfHeight=36;
    	if (newfont.CreateFontIndirect(&lf))
    	{
    		// Set bold font
    		CWnd *pWnd = GetDlgItem(IDC_LIST_AUSGABE);
    		if (pWnd)
    			pWnd->SetFont(&newfont);
    	}
    

    Mir ist aber nicht klar wie ich die Verbindung zu m_font, der Control Membervariable von dem Listenfeld hinbekomme.



  • Also ich habe es auch so probiert, doch immer noch kein Erfolg:

    CFont newfont;
    
            LOGFONT lf;
    	lf.lfUnderline=TRUE;
    	newfont.CreateFontIndirect(&lf))
    	CWnd *pWnd = GetDlgItem(IDC_LIST_AUSGABE);
    	pWnd->SetFont(&newfont);
    


  • versuche dir die schrift von der liste zu holen wenn ich Martin Richter richtig versteh holt er mit

    GetFont()->GetObject(sizeof(LOGFONT),&logfont);
    

    die schrift vom CDialog & nicht von der Liste.

    ich hab da ewig rumprobiert bis das bei mir geklappt hat.
    erstell eine membervariable zB m_CtrlList die von der CListCtrl (IDC_LIST_AUSGABE) kommt

    und hol dir die schrift aus der liste & setze sie mit m_CtrlList.

    CFont *Font
    Font->Detach();
    Font = [b]m_CtrlList.[/b]GetFont();
    
    memset(&lf, 0, sizeof(LOGFONT));
    lf.lfHeight=10; 
    strcpy(lf.lfFaceName,"Courier New");
    
    Font->CreateFontIndirect(&lf);
    [b]m_CtrlList.[/b]SetFont(Font)
    

    mag sein das dieser code nicht perfect und es galantere lösungen gibt
    buggy ist er in keinem fall der code funzt auf beiden arten mit zeigern & auch ohne bei mir in einem simplen Listendialog.

    mfg
    LowFly



  • So hat es geklappt. Dankeschön 🙂



  • sehr schön sag ich doch das der code funzt 🙄
    damit kannst du auch den schriftstiel zur laufzeit des programmes ändern.

    alles was du nur machen must ist nachdem du die schrift wärend der laufzeit geändert hast, die liste löschen & neu erstellen.
    wenn nicht allzuviel drinne steht geht das recht flott.

    mfg
    LowFly


  • Administrator

    Bei erneutem Wechsel des Fonts aber bitte nicht DeleteObject oder ::DeleteFont vergessen zum sicheren säubern. Ein Font, welcher an ein Objekt gebunden ist, wird automatisch zerstört. Ein Font der erstellt wurde aber keinem Objekt mehr angehört, kann in einem Speicherleck resultieren.

    Und das LOGFONT kann man übrigens mit CFont::GetLogFont holen 😉

    Edit: Aja LowFly, dein Code funzt übrigens nicht. Man kann nämlich einen Font nicht zweimal erstellen. Bzw. das gilt allgemein bei allen GDI-Objekten. Nur ein Create aufruf pro Objekt. Probier es mal aus, wirst merken dass ein Assertion kommt.

    Grüssli



  • stimmt sorry 🙄
    was ich vergessen hab ist Detach

    CFont *Font;
    Font->Detach();
    

    nachdem die schrift erstellt wurde.(das gibt die erstellte schrift wieder frei).

    ich kann dir nur das sagen was bei mir funzt und das ist eben das ich die schrift immerwieder neu erstellen kann OHNE das mir das prog abstürzt. (weil ich die schrift immer wieder frei gebe) und ich verwende genau den code den ich hier gepostet hab allerdings mit zeigern auf die Liste. 😉

    auch erstelle ich die schrift in einer seperaten class wo ich sie in der Registry mit all ihren eigenschaften speichere & auch wieder abruf. und dort hab ich auch das Detach verankert.

    mfg
    LowFly


Anmelden zum Antworten