= 67、MFC的BUG ========================================================================= 简介 许多英语程式的对话方块,在中文的系统上执行时,会有挤成一团,甚至有控制 元件跑到对话方块外面的情形。经以前一个骇客追踪过的原因,始作俑者是在 USER32 模组的一个函式 "GetSystemMetrics"。当呼叫叁数为 0x2A 而传回值 eax 为 1 时,就会有这种丑丑的对话方块产生。产生的原因已经获得了解,并以 MFC 中的原始程式码说明之。 _______________________________________________________________________ 说明 下列为从 MFC 中摘录出来的原始程式片段,属於 DlgCore.cpp 的一部份,位於 CWnd::CreateDlgIndirect函式中。这个函式的目的在於,根据传来的对话方块样 版产生一个对话方块。然而下列的程式片段,是其中画蛇添足的部份。 // If no font specified, set the system font. CString strFace; WORD wSize = 0; BOOL bSetSysFont = !CDialogTemplate::GetFont(lpDialogTemplate, strFace,wSize); // On DBCS systems, also change "MS Sans Serif" or "Helv" to system font. if ((!bSetSysFont) && GetSystemMetrics(SM_DBCSENABLED)) { bSetSysFont = ((strFace == _T("MS Sans Serif")) || (strFace == _T("Helv"))); if (bSetSysFont && (wSize == 8)) wSize = 0; } if (bSetSysFont) { CDialogTemplate dlgTemp(lpDialogTemplate); dlgTemp.SetSystemFont(wSize); hTemplate = dlgTemp.Detach(); } 此段程式的目的,在於查验对话方块所用的字型。如果是在远东版本的 Windows 95(如中文版)显示对话方块(呼叫 GetSystemMetrics 取得系统叁数、传叁数 SM_DBCSENABLED,以查询作业系统支援双字元 -- BIG-5、GB、日文、韩文 -- 的能力),并且所用的字型为 "MS Sans Serif" 或 "Helv",就将字形换成作业 系统预设的对话方块字形。其作用尚不明,但是往往预设的字型是「细明体」或 「新细明体」,字元间距与原字形不同,所以对话方块的显示便变形。而且其实 原来的"MS Sans Serif" 或 "Helv"其英数字形比中文字形的英数文字好看得多, 并且使用原本的字型并无伤大雅,我不了解为何写出这段码,故意毁容一个对话 方块。 要修正这个问题,要修改 MFC的程式码,其实只要把上述的部份删掉即可。然而 重新编译後的码,不见得能够被微软所承认。如果是要自己写程式拿去卖的话, 只好在想别的方法以不更动原始的MFC 程式的方法,修补错误。不过不是更改 USER32 使 GetSystemMetrics 的SM_DBCSENABLED 不传回 1 就没事的。此处虽以 MFC举例,但是别的程式亦有可能犯下相同的错误,列出 MFC 的码只是供叁考。 -- Robin Hood Liu Li-Kai, Edwin ICQ UIN: 1311717 (dolphin) mailto:robin.hood@ibm.net -----------------------------------