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

标签 winapi mfc

我的问题是由于我们的程序在日语操作系统上运行而产生的。我的一位同事做了一些事情,比如在对话框中嵌入属性表,并且属性表有多个页面。除日语外,其他语言一切正常。

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

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

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

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

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

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

最佳答案

是的,显然属性表和向导的字体是不同的。每种语言都有一个对话框模板。在 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

关于winapi - 属性表和页面的默认字体是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549466/

相关文章:

c++ - 使用 CListBox::GetTopIndex() 调试断言。想法?

.net - .ocx 文件和 .Net 控件之间的区别

c - 我应该在函数指针的 typedef 中保留 `_In_` 、 `_Out_` 之类的宏吗?

.net - WM_SETREDRAW 并丢失 z 顺序/焦点

c - 调整窗口大小时是否可以完全消除闪烁?

c++ - 如果在系统范围内禁用,则激活窗口主题

c++ - 如何让我的应用程序使用 Windows 主题?

c++ - 如果我在 GetBuffer 之后不调用 ReleaseBuffer 怎么办?

c++ - 我们如何垂直对齐编辑框中的文本?

c++ - 防止双击 MFC-Dialog 按钮