我的问题是由于我们的程序在日语操作系统上运行而产生的。我的一位同事做了一些事情,比如在对话框中嵌入属性表,并且属性表有多个页面。除日语外,其他语言一切正常。
在日本系统上,一些控件会因为空间不足而被切断。我确定这是因为在日语系统上,属性表和属性页使用的字体与属性表的父对话框使用的字体不同。根据记录,父对话框和所有属性页使用的字体是 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
来查找所有字体操作。
关于winapi - 属性表和页面的默认字体是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549466/