属性表和页面的默认字体是什么?

时间:2016-05-31 15:11:56

标签: winapi mfc

我的问题来自我们在日语操作系统上运行的程序。我的一位同事做了类似于在对话框中嵌入属性表并且属性表有多个页面的操作。除了日语之外,其他所有语言都可以正常使用。

在日本系统上,由于没有足够的空间,一些控件会被切断。我确定这是因为在日语系统中,属性表使用的字体因此属性页与属性表的父对话框使用的字体不同。对于记录,父对话框和所有属性页使用的字体是MS Shell Dlg,8:

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

我想要一个简单的解决方案来尝试和改善日语和所有潜在系统的问题。我检查了日语Windows 7属性表/页面上的字体,它们总是看起来是默认的GUI字体。所以,当我创建我的第一个对话框时,在使用MFC类CDialogTemplate将DIALOGTEMPLATE加载到内存后,我会修改父对话框的字体以匹配默认的GUI字体,并且在日语Windows上一切都会好的 - -Window 7,就是。

客户现在发现这不是Windows 8 / 8.1的有效解决方案 - 它表现出原始问题。在检查Windows 8.1 VM上的字体后,我确定Windows 8.1上的属性表和子属性页不使用默认GUI字体。

要问很多话。有没有办法确定Windows系统上属性表使用的默认字体是什么?

我认为我丑陋的解决方法是创建一个包含一个属性页的属性表,确定该属性表和页面使用的字体,然后动态修改父对话框的对话框模板以使用该字体。由于属性表有一些关于激活的怪癖(即使看不见它们也会在创建时激活),我宁愿不这样做,但它似乎是我唯一的选择 - 除了重新设计我的同事之外对话框。

3 个答案:

答案 0 :(得分:3)

是的,显然属性表和向导的字体是不同的。每种语言都有一个对话框模板。在WinAPI PropertySheet中使用该模板中的字体。

要查找此字体,请使用以下内容(我仅在Windows 10上对此进行了测试)

#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);
}

这可能有点过时了。从SystemParametersInfo(SPI_GETNONCLIENTMETRICS...)获取的字体必须已兼容,因为它是主要的显示字体。

出于某种原因,MFC会更进一步,并将该模板字体应用于属性页面。 MFC执行其他我无法理解的事情,例如VS2015在"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);
    }
    ...
}

我不知道为什么如果存在某种字体,它会强制使用子语言。同样正如@PRinCEKtd指出的那样,这个字体可能已经过时(但仍然可以安装字体)您可以单步执行CPropertySheet来查找所有字体操作。

另见codeguru link, Custom Font in Property Sheets

答案 1 :(得分:0)

尝试使用

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

通常所有系统控件(状态栏,列表视图,树视图,菜单,消息框......)都使用此结构中的字体

其中GetNONCLIENTMETRICSWSize()可以是这样的(在XP / 2003(主要< 6)结构大小较少的4字节比较vista +)

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

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

答案 2 :(得分:0)

从Windows Vista开始,Meiryo字体系列在Windows用户界面中用作默认支持日语。我想在vista之前,它是MS Gothic ......

如何直接手动设置默认的Windows字体?有许多字体支持日语以及各种语言。其中一些已经从XP到10,但它们可能有一些更新。