ビジュアルC++アプリケーションですべてのダイアログフォームのフォントを変更するには?
タホマスタイルにしたい。
ありがとう。
アプリケーションの各ダイアログでフォントを置き換えるのは、かなり面倒な作業です。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 を含めます。
ダイアログの作成元のリソースで、ダイアログのフォントを設定できます。すべての標準コントロールのフォントも変更されると思います。カスタム コントロールがある場合は、追加の作業を行う必要があります。
フォントをコンピュータのデフォルトの UI フォントと一致させたい場合は、XP では Tahoma に、Vista+ では Segoe UI にマップされる「MS Shell Dlg 2」などの仮想フォントを使用できます。
私はちょうど何かに気づきました。間違いではありませんが、説明が必要です。私はこのコードを非常に長い間リポジトリに保管してきました。DLL がすべてのデータをグローバルとして保持し、この dll をロードしたすべてのモジュールでデータを利用できるようにした時代でした。データを強制的に TLS 領域に保存するために、まだ生きている CProcessLocal クラスを呼び出すように展開する PROCESS_LOCAL マクロを使用しました。このマクロを削除して、次のものに置き換えることができます。
BOOL CDlgFontChangeApp::InitInstance()
{
CDlgOccManager* pManager = new CDlgOccManager();
AfxEnableControlContainer(pManager);
.
.
.
}