【问题标题】:Change visual c++ application font更改 Visual C++ 应用程序字体
【发布时间】:2012-05-23 07:29:09
【问题描述】:

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

我想设置 Tahoma 样式。

谢谢。

【问题讨论】:

    标签: visual-c++ fonts gdi


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Adrian,但我想为应用设置默认字体。突然我必须在这个项目中使用自定义控件。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      BOOL CDlgFontChangeApp::InitInstance()
      {
          CDlgOccManager* pManager = new CDlgOccManager();
          AfxEnableControlContainer(pManager);
      .
      .
      .
      }
      

      【讨论】:

        猜你喜欢
        • 2017-06-21
        • 2015-12-19
        • 2015-08-17
        • 1970-01-01
        • 2011-11-20
        • 2023-03-18
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多