1

ビジュアルC++アプリケーションですべてのダイアログフォームのフォントを変更するには?

タホマスタイルにしたい。

ありがとう。

4

3 に答える 3

1

アプリケーションの各ダイアログでフォントを置き換えるのは、かなり面倒な作業です。MFC を使用してそれを行うことができます。アプリの InitInstance を確認します。AfxEnableControlContainer(); を見てください。AfxEnableControlContainerが次のように宣言されていても、パラメータなしで呼び出されています

void AFX_CDECL AfxEnableControlContainer(COccManager* pOccManager=NULL);

COccManager は非常に興味深いクラスであり、occ (OLE カスタム コントロール) がサポートされている場合に使用され、OLE コンテナーとサイト クラスを管理します。すべての MFC アプリケーションは、デフォルトで occ サポート付きで作成されます。ウィザードによって生成されたコードに AfxEnableControlContainer が表示されない場合は、occ サポートが有効になっていません。

とにかく、デフォルトの occ 実装を使用する代わりに、独自のものを使用し、それを変更してフォントを変更します。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 に答える
1

ダイアログの作成元のリソースで、ダイアログのフォントを設定できます。すべての標準コントロールのフォントも変更されると思います。カスタム コントロールがある場合は、追加の作業を行う必要があります。

フォントをコンピュータのデフォルトの UI フォントと一致させたい場合は、XP では Tahoma に、Vista+ では Segoe UI にマップされる「MS Shell Dlg 2」などの仮想フォントを使用できます。

于 2012-05-15T19:21:16.153 に答える
0

私はちょうど何かに気づきました。間違いではありませんが、説明が必要です。私はこのコードを非常に長い間リポジトリに保管してきました。DLL がすべてのデータをグローバルとして保持し、この dll をロードしたすべてのモジュールでデータを利用できるようにした時代でした。データを強制的に TLS 領域に保存するために、まだ生きている CProcessLocal クラスを呼び出すように展開する PROCESS_LOCAL マクロを使用しました。このマクロを削除して、次のものに置き換えることができます。

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