如何在 Visual C++ 应用程序中更改所有对话框表单中的字体?
我想设置 Tahoma 风格。
谢谢。
您可以在创建对话框的资源中设置对话框的字体。我相信这也会改变所有标准控件的字体。如果您有自定义控件,则必须做额外的工作。
请注意,如果您想让字体与计算机的默认 UI 字体匹配,则可以使用虚拟字体,例如“MS Shell Dlg 2”,它将映射到 XP 上的 Tahoma 和 Vista+ 上的 Segoe UI。
在应用程序的每个对话框中替换字体将是一项相当乏味的工作。您可以使用 MFC 为您做这件事。检查您的应用程序的 InitInstance。看看 AfxEnableControlContainer(); 即使 AfxEnableControlContainer 被声明为
void AFX_CDECL AfxEnableControlContainer(COccManager* pOccManager=NULL);
COccManager 是一个非常有趣的类,当有 occ(OLE 自定义控件)支持时使用,管理 OLE 容器和站点类。默认情况下,所有 MFC 应用程序都是使用 occ 支持创建的。如果您在向导生成的代码中没有看到 AfxEnableControlContainer,则说明您没有启用 occ 支持。
无论如何,而不是使用默认的 occ 实现,使用 own 并更改它以更改字体。从 COccManager 派生类。在此示例中,我将其称为 CDlgOccManager。覆盖虚拟 PreCreateDialog:
virtual const DLGTEMPLATE* PreCreateDialog(_AFX_OCC_DIALOG_INFO* pOccDialogInfo,
const DLGTEMPLATE* pOrigTemplate);
在实施中:
const DLGTEMPLATE* CDlgOccManager::PreCreateDialog(_AFX_OCC_DIALOG_INFO* pOccDialogInfo, const DLGTEMPLATE* pOrigTemplate)
{
CDialogTemplate RevisedTemplate(pOrigTemplate);
// here replace font for the template
RevisedTemplate.SetFont(_T("Tahoma"), -16);
return COccManager::PreCreateDialog (pOccDialogInfo, (DLGTEMPLATE*)RevisedTemplate.Detach());
}
现在您正在更改所有对话框的字体。请记住更改 AfxEnableControlContainer 调用:
PROCESS_LOCAL(CDlgOccManager, pManager);
BOOL CDlgFontChangeApp::InitInstance()
{
AfxEnableControlContainer(pManager.GetData());
.
.
.
}
不要忘记
#include "DlgOccManager.h"
对于 MFC 的新版本,包括用于旧版本的 afxdisp.h,用于 COccManager 的 occimpl.h。
我刚刚注意到一些事情。这不是一个错误,但它需要一个解释。我已经将这段代码保存在我的存储库中很长时间了。那时 DLL 将所有数据保持为全局数据,从而使加载此 dll 的所有模块都可以使用数据。为了强制将数据存储在 TLS 区域中,我使用了 PROCESS_LOCAL 宏,该宏扩展为调用仍然存在的 CProcessLocal 类。您可以删除此宏并将其替换为:
BOOL CDlgFontChangeApp::InitInstance()
{
CDlgOccManager* pManager = new CDlgOccManager();
AfxEnableControlContainer(pManager);
.
.
.
}