2016-05-31 4 views
1

Meine Frage ergibt sich aus unserem Programm auf einem japanischen Betriebssystem ausgeführt. Einer meiner Mitarbeiter hat so etwas wie das Einbetten eines Eigenschaftsblatts in einen Dialog getan, und das Eigenschaftsblatt hat mehrere Seiten. Bei anderen Sprachen außer Japanisch funktioniert alles einwandfrei.Was ist die Standardschrift für Eigenschaftenblätter und Seiten?

Auf japanischen Systemen werden einige Steuerelemente abgeschnitten, weil nicht genügend Platz vorhanden ist. Ich habe festgestellt, dass dies darauf zurückzuführen ist, dass auf japanischen Systemen die vom Eigenschaftenfenster und damit von den Eigenschaftenseiten verwendete Schriftart von der im übergeordneten Dialogfeld des Eigenschaftenblattes verwendeten Schriftart abweicht. Für die Aufzeichnung der Schrift von der Mutter Dialog und alle Eigenschaftsseiten verwendet MS Shell Dlg, 8: eine einfache Lösung, um zu versuchen und zu verbessern das Problem für japanische und all mögliche System

FONT 8, "MS Shell Dlg", 0, 0, 0x1 

ich wollte. Ich habe die Schriftarten auf japanischen Windows 7-Eigenschaftenblättern/-seiten untersucht, und sie wurden immer als Standard-GUI-Schrift erkannt. Als ich also mein erstes Dialogfeld erstellte, nachdem ich die DIALOGTEMPLATE mit der MFC-Klasse CDialogTemplate in den Speicher geladen hatte, änderte ich die Schriftart des übergeordneten Dialogfelds so, dass sie der Standard-GUI-Schriftart entsprach. -Window 7, das ist.

Ein Kunde hat jetzt festgestellt, dass dies keine gültige Lösung für Windows 8/8.1 ist - es zeigt das ursprüngliche Problem. Nach dem Überprüfen der Schriftarten auf einer Windows 8.1-VM habe ich festgestellt, dass das Eigenschaftsfenster unter Windows 8.1 und die untergeordneten Eigenschaftenseiten nicht die Standard-GUI-Schriftart verwenden.

Das sind viele Worte zu fragen. Gibt es eine Möglichkeit, die Standardschriftart zu bestimmen, die von den Eigenschaftenblättern auf einem Windows-System verwendet wird?

Ich denke, meine hässliche Problemumgehung wäre, ein Eigenschaftsblatt mit einer Eigenschaftsseite zu erstellen, die von diesem Eigenschaftsblatt und dieser Seite verwendete Schriftart zu bestimmen und dann die Dialogvorlage meines Elterndialogs zu ändern, um diese Schriftart zu verwenden. Da Eigenschaftsseiten einige Eigenarten der Aktivierung haben (sie werden bei der Erstellung aktiviert, selbst wenn sie unsichtbar sind), würde ich es lieber nicht tun, aber es scheint meine einzige Wahl zu sein - abgesehen davon, dass ich die Dialoge meiner Mitarbeiter überarbeitet habe.

+0

Wenn möglich, erstellen/Ihre Dialoge in Ressourcen-Editor bearbeiten „Segoe UI“ Größe 9. Dies ist die Standardschriftart für Vista + zu verwenden. Es gibt kein Problem, wenn Sie sich nicht um WinXP sorgen. –

+0

Fonts sind [kompliziert] (http://stackoverflow.com/a/6057761/5240004) Wenn Sie einen Testcomputer mit 8/8.1 mit dem installierten japanischen Sprachpaket haben, können Sie die Schriftart mit 'GetDC' und dem Fenster finden handle (wahrscheinlich das Elternfenster des Eigenschaftsfensters), dann 'GetTextFace', um den Namen der Schriftart zu erhalten, und' GetTextMetrics', um die Größeninformationen zu erhalten. (Angenommen, dass die Schriftart in diesem DC tatsächlich ausgewählt ist) – theB

+0

@BarmakShemirani Die Standardschriftart, die von Visual Studio erstellt wird, und ich nehme von Windows an, ist "MS Shell Dlg" 8 Pt. In meiner US-Windows-7-Box ist dies die Schriftart, die zum Erstellen von Eigenschaftenblättern verwendet wird. Natürlich ist MS Shell Dlg eine Alias-Schriftart. In der Vergangenheit erinnere ich mich an Probleme mit japanischen Systemen, weil sie nicht immer Segoe UI haben. –

Antwort

2

Ja, anscheinend ist die Schriftart für Eigenschaftenblatt und Assistenten unterschiedlich. Für jede Sprache gibt es eine Dialogvorlage. In WinAPI PropertySheet verwendet die Schriftart aus dieser Vorlage.

Um diese Schriftart verwenden Sie das folgende

#define IDD_PROPSHEET 1006 
#define IDD_WIZARD  1020 

HMODULE hmod = LoadLibrary(L"comctl32.dll"); 
if (hmod) 
{ 
    HRSRC hres = FindResource(hmod, MAKEINTRESOURCEW(IDD_PROPSHEET), (LPWSTR)RT_DIALOG); 
    if (hres) 
    { 
     HGLOBAL hglob = LoadResource(hmod, hres); 
     if (hglob) 
     { 
      CString fontname; 
      WORD fontsize; 
      CDialogTemplate::GetFont((DLGTEMPLATE*)hglob, fontname, fontsize); 
      TRACE(L"%s %d\n", fontname, fontsize); 
     } 
    } 
    FreeLibrary(hmod); 
} 

(ich dies nur unter Windows 10 getestet) Dies kann etwas veraltet sein.Die aus SystemParametersInfo(SPI_GETNONCLIENTMETRICS...) erhaltene Schriftart muss bereits kompatibel sein, da es sich um die Hauptschriftart handelt.

Aus irgendeinem Grund nimmt MFC Dinge weiter und wendet diese Vorlage Schriftart auf Eigenschaftenseiten. MFC tut andere Dinge, die ich nicht verstehen kann, beispielsweise VS2015 hat diesen Code in "dlgprop.cpp"

LANGID langid = GetUserDefaultUILanguage(); 
if ((PRIMARYLANGID(langid) == LANG_JAPANESE) && IsFontInstalled(_T("MS UI Gothic"))) 
{ 
    WORD wLang = MAKELANGID(LANG_JAPANESE, 0x3f); 
    if (wLang != 0) 
    { 
     hResource = ::FindResourceExW(hInst, (LPWSTR) RT_DIALOG, 
       MAKEINTRESOURCEW(bWizard ? IDD_WIZARD : IDD_PROPSHEET), wLang); 
    } 
    ... 
} 

Ich weiß nicht, warum es eine Unter Sprache zwingt, wenn eine bestimmte Schriftart vorhanden ist. Wie auch @PRinCEKTd darauf hinweist, könnte diese Schriftart veraltet sein (aber die Schriftart könnte noch installiert sein). Sie können durch CPropertySheet gehen, um alle Schriftartmanipulationen zu finden.

siehe auch codeguru link, Custom Font in Property Sheets

+0

Großartige Forschung. Ich würde dich jederzeit für einen Job empfehlen. –

0

try

NONCLIENTMETRICS ncm = { GetNONCLIENTMETRICSWSize() }; 
if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)){..} 

üblich alle Systemsteuerungen (Statusleiste, Listenansicht, Baumansicht, Menü, Meldungsfeld ..) Schriften aus dieser Struktur verwenden

wo GetNONCLIENTMETRICSWSize() kann wie sein dies (auf XP/2003 (Haupt < 6 struct Größe) weniger auf 4 Byte vista + vergleichen)

ULONG GetNONCLIENTMETRICSWSize() 
{ 
    static ULONG m; 
    if (!m) 
    { 
     RtlGetNtVersionNumbers(&m, 0, 0); 
    } 

    return m < 6 ? sizeof(NONCLIENTMETRICS) - 4 : sizeof(NONCLIENTMETRICS); 
} 
+0

Nun, danke für die Antwort, aber das ist nicht die Antwort. Keines der zurückgegebenen LOGFONTs stimmt mit der Schriftart des Eigenschaftenblattes/der Seite überein. Die Schriften, nach denen ich suche, befinden sich tatsächlich im Client-Bereich und nicht im Nicht-Client-Bereich. Vielleicht ist ein anderer SystemParametersInfo() Aufruf die Antwort ... –

+1

Das sollte funktionieren. 'ncm.lfMessageFont.lfFaceName' sollte unter Vista +" Segoe UI "zurückgeben. Welche Schriftart erwarten Sie? –

+0

Es ist nicht unbedingt der Name, der das Problem ist, aber die Größe. Wenn ich die Schriftarten in meinem Dialogfeld, Eigenschaftenblatt und Seiten lf.lfHeight = -11 ansehe, was bei 96 DPI 8 pt ist. Alle diese Strukturen auf meinem US-System geben lf.lfHeight = -12 zurück, was nicht dasselbe ist und Layoutprobleme verursacht. Das Layout der Steuerelemente in einem Dialogfeld ist eine Kombination aus Schriftart und Größe. –

0

Von Windows Vista an wurde die Meiryo Schriftfamilie als Standard in t verwendet Die Windows-Benutzeroberfläche zur Unterstützung von Japanisch. Ich denke, vor Vista war es MS Gothic ...

Wie wäre es mit der manuellen Einstellung einer Standard-Windows-Schriftart direkt? Es gibt viele Schriftarten, die Japanisch sowie eine Vielzahl von Sprachen unterstützen. Einige von ihnen waren von XP bis 10 vorhanden, obwohl sie einige Updates haben könnten.