Wo ist die Schriftart



  • Moin, moin,

    mit dem VS2005 Resourceneditor erstelle ich einen Dialog. Unter anderem enthält das *.rc Script fogende Zeile:

    FONT	9, "MS Shell Dlg"
    

    der Dialog wir erstellt soweit so gut. Ich hab mir dann eine kleine Funktion geschrieben um den Schriftnamen für ein Fensterhandle zu ermittelt. Die Funktion ermittelt mir dann als Namen: "MS Shell Dlg 2" was für mich soweit auch ok ist.
    Jetzt habe ich eine andere Funktion geschrieben um den Standard Dialog "Choose Font" aufzurufen. Was mich jetzt überrascht ist, daß diese Schriftart nicht in der Auswahlliste auftaucht. Wie ist das möglich? Hier mein Funktionsaufruf:

    boolean DialogFontSelection(char *headline){
    
    	CHOOSEFONT		cf;
    
    	memset(&cf, 0, sizeof(cf));
    	cf.lStructSize = sizeof(CHOOSEFONT);
    	cf.hwndOwner = NULL;
    	cf.hDC = NULL;
    	cf.lpLogFont = &font.pop_logfont;			//extern definiert
    	cf.iPointSize = 0;
    	cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_BOTH | CF_LIMITSIZE | CF_ENABLEHOOK;
    	cf.rgbColors = 0;
    	cf.lCustData = 0;
    	cf.lpfnHook =  (LPCCHOOKPROC)DialogFontSelection_EventHandler;
    	cf.lpTemplateName = headline;
    	cf.hInstance = NULL;
    	cf.lpszStyle = NULL;
    	cf.nFontType = 0;	
    	cf.nSizeMin = 6;
    	cf.nSizeMax = 18;
    	if(ChooseFont(&cf) != 0){
    		return TRUE;
    	}else{
    		return FALSE;
    	}
    }
    

  • Mod

    "MS Shell Dlg" ist kein echter Font. Es wird je nach Windows Version auf einen internen Font gemapped.
    http://support.microsoft.com/kb/282187
    http://msdn.microsoft.com/en-us/library/dd374112(VS.85).aspx



  • Ja danke, ich habs mitlerweile per Registrysuche gefunden:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes\MS Shell Dlg 2
    

    zeigt bei mit auf "Tahoma"



  • Ich habe jetzt noch eine Frage die mit diesem Thema verwand ist, daher möcht ich keinen neuen Thread eröffnen.
    Wenn ich nun mein Resourcenscript soweit abänder dass anstatt

    FONT    9, "MS Shell Dlg"
    

    dort folgendes steht

    FONT    18, "MS Shell Dlg"
    

    wird der Dialog automatisch mit der richtigen Höhe für z.B. ein Textfeld erzeugt. Ändere ich jedoch zur Laufzeit die Schriftgrösse des Dialogs von 9 auf 18 bleiben die Elemente darin in ihrer ursprünglichen Größe erhalten, d.h. der Text wird von der Höhe her abgeschnitten. Ich glaub irgendwo mal eine Funktion gesehen zu haben wo man das irgendwie skallieren kann?


  • Mod

    Du setzt damit nur den Font des Dialoges und nicht den der Kinder. Du müsstest dann jedes Element einzeln anfassen und ihm den Font setzen und ihn vergrößern.
    Der Dialog mit seinen Child-Fenstern wird nur beim Start in den entsprechenden Größen erzeugt und bekommt den gewünschten Font. Dannach gibt es keine automatische Abhängigkeit mehr.



  • Ja, danke das war mir bekannt und das habe ich schon mit EnumChildWindows und dem entsprechenen Eventhandler realisiert. Es funktioniert soweit, dass unabhängig vom Dialog, grundsätzlich alle darin enhaltenen Elemente meinen "Einheits"-Font erhalten. Der Dialog ist so ausgelegt, dass beim Event "WM_INITDIALOG" erstmal alle Elemente rechnerisch an die richtige Position gebracht werden. Ebenso wird an dieser Stelle der Font gesetzt. Leider passen die Berechnungen nicht, wenn der Dialog ursprünglich für Fontsize 9 erzeugt und jetzt auf Fontsize 12 vergrössert wird. Hast du da einen Tip für mich wie ich da am geschicktesten vorgehe.



  • Andere Idee: kann man sich nicht eine Kopie des Dialogtemplates (DLGTEMPLATEEX) zur Laufzeit erstellen und dort die Teile für den Font manipulieren und über CreateDialogIndirect dieses manipulierte Template aufrufen?


  • Mod

    Klar kann man! Macht die MFC auch ;), da gibt es sogar eine Helferklasse dazu.



  • Martin Richter schrieb:

    Klar kann man! Macht die MFC auch ;), da gibt es sogar eine Helferklasse dazu.

    Schön, leider weiss ich jetzt nicht wie ich das machen soll. Könntest du mir da weiterhelfen?


  • Mod

    Schau in den MFC Sourcecode rein. Schau in die MSDN, dort steht das Layout des Templates beschrieben. IMHO gibt es auf Codeproject auch Code.



  • Ok, war mit einigen Klimmzügen verbunden die Struktur "DLGTEMPLATEEX" auszuwerten und zu modifizieren aber jetzt gehts. Ist aber schon verwunderlich, dass MS eine Funktion bereitstellt die eine Verwendung der Struktur erlaubt, aber nichts anbietet um mit dieser pseudo Struktur zu arbeiten.


  • Mod

    Warum auch? Das Prinzip ist/war ja, dass diese Struktur durch den Ressourcen-Compiler erzeugt wird. Gelsen wird Sie eben von den Dialog-Funktionen.


Log in to reply