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



  • 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?



  • Anmerkung: Sobald das Fenster ein Menü hat, sollte man nur CSingleLineCaption verwenden, da das Menü sonst nicht mehr angezeigt wird. 😞
    Da dann aber größere Schrift unten abgeschnitten wird, muss man nachbessern:

    ////////
    // Calculate the caption text clipping rect
    //
    CRect CCaption::GetTextRect()
    {
    	CRect textRect = GetCaptionRect();
    	textRect.left += GetIconWidth();
    	textRect.right -= GetButtonsWidth() + 4;
    // 	textRect.top -= 2;
    	textRect.top -= 6;
    	return textRect;
    }
    

    Außerdem muss man das Icon von Hand nochmal mit SetIcon festlegen.


Anmelden zum Antworten