Titelzeile (SDI/MDI): Font, Farbe, Hintergrund ändern + mehrzeilig anzeigen



  • Hallo!

    Meine Anwendung soll in der Titelzeile immer einige Informationen anzeigen:
    Anwendungsname - Benutzer aktuelle Maske Kundenname und weitere Infos

    Nun ist das in der Standardgröße aber zu klein.
    Ich soll das auf Schriftgröße 14 stellen. 😮
    Dann passt das aber nicht mehr alles rein. 🙄

    Ich kann nun ein paar Leerzeichen weglassen, aber ich möchte das nicht immer, sondern nur, wenn der Benutzer tatsächlich so eine Blindenschriftart eingestellt hat.
    Wie finde ich raus, wieviel Platz ich da oben noch habe oder eben nicht?

    Oder hat jemand ne bessere Idee, wie ich diese Infos in JEDER der zig Masken groß anzeigen kann? 🙂
    Sind alles CFormViews.

    Edit: Breff geändert, vorher "Titelzeile: Schriftmaße herausfinden oder Alternative gesucht"



  • Wenn der Benutzer unbedingt mit 5Pt Texten arbeiten will, ist das doch seine Entscheidung 😉 (der wird schon seine Gründe dafür haben)

    Ansonsten könntest du per CWnd::SetFont() eine neue Schrift für dein Fenster einstellen.



  • Naja, ich wollte die Einstellung der Schriftgröße eigentlich wenigstens dort dem Benutzer überlassen, denn ich finde diese Monsterschrift gräßlich. 😮
    Aber ich guck mir deinen Vorschlag mit SetFont mal an, hoffentlich bleiben die Buttons klein... 🙄
    (Hätte nicht gedacht, dass das beim Hauptfenster klappt.)



  • estartu schrieb:

    Naja, ich wollte die Einstellung der Schriftgröße eigentlich wenigstens dort dem Benutzer überlassen, denn ich finde diese Monsterschrift gräßlich. 😮

    Wem's gefällt 😃
    (btw, wenn dir die Schrift nicht gefällt, in der Systemsteuerung unter "Anzeige" kannst du sie für dein System anpassen)



  • CStoll (off) schrieb:

    estartu schrieb:

    Naja, ich wollte die Einstellung der Schriftgröße eigentlich wenigstens dort dem Benutzer überlassen, denn ich finde diese Monsterschrift gräßlich. 😮

    Wem's gefällt 😃
    (btw, wenn dir die Schrift nicht gefällt, in der Systemsteuerung unter "Anzeige" kannst du sie für dein System anpassen)

    Jepp, ich weiß. 😃
    Jetzt wüßte ich aber gerne, wie ich rausfinde, was der Benutzer da eingestellt hat. Ich möchte da nur ungern eine feste Schriftart vorgeben - wenn ich schon die Größe vorgeben muss, was mir eigentlich auch widerstrebt. 🙂

    PS: Das hier zeigt keine Wirkung (in InitInstance)

    // Die Schrift für die Überschriften erzeugen
    		LOGFONT lf;
    		memset(&lf, 0, sizeof(LOGFONT)); // Initialisieren
    		lf.lfHeight = 20; // Schriftgröße
    		lf.lfWeight = FW_BOLD;
    		strcpy(lf.lfFaceName, _T("MS Sans Serif")); // Schriftart
    		m_fontTitel.CreateFontIndirect(&lf);
    
    		// Die Schrift festlegen
    		m_pMainWnd->SetFont(&m_fontTitel);
    
    		// Das Hauptfenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden.
    		m_pMainWnd->UpdateWindow();
    


  • So, ich hab raus, wie ich die aktuelle Schriftart auslese - aber das hat null Wirkung. 😞

    LOGFONT lf;
    		memset(&lf, 0, sizeof(LOGFONT)); // Initialisieren
    		SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0);
    		// Die Schrift für die Überschriften erzeugen
    		lf.lfHeight = 20; // Schriftgröße (ist vorher -11 ?!?)
    		m_fontTitel.CreateFontIndirect(&lf);
    
    		// Die Schrift festlegen
    		m_pMainWnd->SetFont(&m_fontTitel);
    

    Edit: Keine Ahnung, von was ich da die Schriftart auslese - Titelleisten sinds jedenfalls nicht. 😞

    ...also weitersuchen. 😞



  • Wieso hat das keine Wirkung? 😞



  • Würde gerne helfen, aber habe gerade keinen Plan. Google wirft auch nichts Gutes heraus.

    EDIT: Hm, hast du dir mal TEXTMETRIC angeschaut? Da kann man auch die Höhe, etc einstellen. Und mit GetStockObject() bekommt man wohl auch nen Handle auf die Schriftart (wenn ich das richtig verstanden habe).
    Das sind nur so Sachen, die ich beim Durchstöbern gefunden habe.
    Vielleicht hilt es ja.

    MfG,
    Paul.



  • estartu schrieb:

    // Die Schrift für die Überschriften erzeugen
    	lf.lfHeight = 20; // Schriftgröße (ist vorher -11 ?!?)
    

    Value Meaning
    > 0 The font mapper transforms this value into device units and matches it against the cell height of the available fonts.
    0 The font mapper uses a default height value when it searches for a match.
    < 0 The font mapper transforms this value into device units and matches its absolute value against the character height of the available fonts.



  • Also, folgender Code ändert die Größe im nonclient Bereich:

    NONCLIENTMETRICS metrics;
    	metrics.cbSize = sizeof(metrics);
    	 ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &metrics, 0);
    
    	CWindowDC wdc(NULL);
    	int nLPixY = GetDeviceCaps(wdc.m_hDC, LOGPIXELSY);
    
    	// m_nFontSize = metrics.lfStatusFont.lfHeight;
    	m_nFontSize = metrics.lfStatusFont.lfHeight=36;
    	m_nPointSize = -MulDiv(m_nFontSize,72,nLPixY);
    
    	_tcscpy(metrics.lfStatusFont.lfFaceName, m_strFaceName);
    	m_Font.CreateFontIndirect(&metrics.lfStatusFont);
    

    Habe ich von Codeproject : http://www.codeproject.com/gdi/setfont.asp#xx883563xx

    Evtl. auch noch nützlich: http://www.codeproject.com/gdi/customcaption.asp



  • Uff, das sieht ja völlig fremd aus. 😮
    Danke, das schau ich mir gleich mal an. 👍



  • Und schreib mal, wenn es funktioniert hat. Hat meine Neugierde geweckt. 🙂
    Viel Erfolg.

    Paul.



  • Bist du eigentlich schon weiter gekommen?



  • Nein, ich war dann davon abgekommen, weil ich erstmal die leichteren Änderungen machen wollte. 🙄
    Ich melde mich dann aber hier. 🙂



  • So, ich habe mir gerade mal das Demoprojekt geladen.
    Leider haben die Änderungen nur in den Childfenstern Effekt. 😞

    Ich brauchs ja im Mainframe.

    Hoffentlich kann ich das anpassen. 🙄



  • Ja, ist mir da auch aufgefallen. Aber ich bin mir sicher, dass du das schaffst (und hier dann die Lösung veröffentlichst). 😃

    Viel Erfolg!

    Paul.



  • Jupp, man kann es anpassen. 👍

    im Header vom Mainframe:

    CMultiLineCaptionEx m_Caption;
    

    im cpp:

    m_Caption.Install(this);
    	LOGFONT lf;
    	m_Caption.GetTextAttributes()->GetActiveFont()->GetLogFont(&lf);
    	lf.lfHeight = -80;
    	m_Caption.GetTextAttributes()->SetActiveFont(lf);
    

    Und schon erschlägt einen die Überschrift. 😃

    ...aber rein theoretisch kann man so herausfinden, was eingestellt ist und dann vielleicht doch nur die angezeigte Textmenge anpassen. 🙂
    ...ach egal, ich lass es bei der riesigen Kurzform. 😉



  • Sehr schön. Das ging ja schnell. 🙂
    Vielleicht sollte ich mir die Klasse auch nochmal anschauen...

    👍 Weiter so!



  • So, ich habs jetzt in mein Projekt übernommen, hat ganz gut funktioniert.
    Wenn man keinen Maximieren-Knopf haben will, gibts allerdings einen Fehler, dazu steht eine Lösung in der Diskussion zum Programm.

    Damit funktioniert es jetzt, ich kann wieder minimieren ohne ins leere klicken zu müssen. 😉

    Leider macht das einfach eine blaue Titelzeile, keine mit Farbverlauf - bzw ich hab jetzt ehrlich keinen Bock mehr, mir rauszusuchen, wie ich die Titelzeilenfarben rausfinde und dann eine GradientCaption zu nutzen. 🙄

    Ist okay so. 🙂



  • Solange du zufrieden bist. 🙂
    Vielleicht kann das hier auch in die FAQ?


Anmelden zum Antworten