1

如何在 Visual C++ 应用程序中更改所有对话框表单中的字体?

我想设置 Tahoma 风格。

谢谢。

4

3 回答 3

1

您可以在创建对话框的资源中设置对话框的字体。我相信这也会改变所有标准控件的字体。如果您有自定义控件,则必须做额外的工作。

请注意,如果您想让字体与计算机的默认 UI 字体匹配,则可以使用虚拟字体,例如“MS Shell Dlg 2”,它将映射到 XP 上的 Tahoma 和 Vista+ 上的 Segoe UI。

于 2012-05-15T19:21:16.153 回答
1

在应用程序的每个对话框中替换字体将是一项相当乏味的工作。您可以使用 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。

于 2012-05-17T00:31:26.037 回答
0

我刚刚注意到一些事情。这不是一个错误,但它需要一个解释。我已经将这段代码保存在我的存储库中很长时间了。那时 DLL 将所有数据保持为全局数据,从而使加载此 dll 的所有模块都可以使用数据。为了强制将数据存储在 TLS 区域中,我使用了 PROCESS_LOCAL 宏,该宏扩展为调用仍然存在的 CProcessLocal 类。您可以删除此宏并将其替换为:

BOOL CDlgFontChangeApp::InitInstance()
{
    CDlgOccManager* pManager = new CDlgOccManager();
    AfxEnableControlContainer(pManager);
.
.
.
}
于 2012-05-17T00:39:59.073 回答