表示フォントの変更を行おう
MFCのディフォルトでは、フォントは"System"フォントが使われるようになっていますが、ウィンドウズのメモ帳などは、"MS ゴシックP"など日本語フォントが指定されているために、非常に見やすいフォントになっています。そこでフォントを変更できるようにしてみましょう。
9.初期フォントを決める(LOGFONT構造体)
ここでいう初期フォントとは、初めて起動した時に表示されるフォントのことです。ここでLOGFONT構造体を知らなくてはなりません。以下にLOGFONT構造体の定義を書いておきます。

LOGFONT構造体
typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT, *PLOGFONT;
とわけのわからない定義が出てきましたが、これがフォントの属性を決めています。例えば、lfHeightは、デバイス単位でのフォントの高さだったりします。これに関してはまた後で述べたいと思います。またMFCにはCFontクラスというものがあって、フォントの変更や設定はこのクラスの変数を使用しますが、このクラスではFontの属性をいじれません。LOGFONT構造体変数をCFontオブジェクトが読み込むことによってフォントを作成します。では実際に行ってみましょう。
1.メンバ変数を追加する。
CMyHtmlViewクラスに以下の変数を追加する。(追加の仕方は…わかりますよね。)これらの変数はViewのメンバとなります。
変数のタイプ変数名アクセス制御
CFontcViewFontpublic
LOGFONTlfInitpublic
2.lfInitを初期化する。
lfInitつまりメンバ変数の初期化といったらコンストラクタですね。ということで、コンストラクタCMyHtmlView::CMyHtmlView()に以下のコードを記述します。
LOGFONTの初期化
CMyHtmlView::CMyHtmlView()
{
lfUnit.lfHeight = 18;
lfUnit.lfHeight = 18;
lfUnit.lfWidth = 8;
lfUnit.lfEscapement = 0;
lfUnit.lfOrientation = 0;
lfUnit.lfWeight = 400;
lfUnit.lfItalic = 0;
lfUnit.lfUnderline = 0;
lfUnit.lfStrikeOut = 0;
lfUnit.lfCharSet = 128;
lfUnit.lfOutPrecision = 1;
lfUnit.lfClipPrecision = 2;
lfUnit.lfQuality = 2;
lfUnit.lfPitchAndFamily = 2;
strcpy(lfUnit.lfFaceName,"FixedSys");
}
でこれは何?と思われるかもしれませんが、一般的なフォントの属性を設定した結果です。詳しくはMSDNなどを参照してください。ここではフォント名にFixedSysを設定しています。このフォントはVisucalC++での基本フォントと同じです。ちなみに私はこれが一番見やすいと思っています。忘れていましたが、このViewの基本クラスはCEditViewクラスなので、一部のフォントのみを変更することはできません。つまりフォントの変更ができてもView全てのフォントが変更されることに注意してください。(もし一部のフォントを変更するにはCRichEditViewクラスを使う必要があります。)
3.起動時にフォントを設定するコードを書き込む
いま行っていることは、Viewの初期フォントの設定ですから、Viewがアタッチされる関数で記述すればいいのですね。ここでは、CMyHtmlView::OnInitialUpdate()に記述します。
初期フォントの設定
void CMyHtmlView::OnInitialUpdate(){
CEditView::OnInitialUpdate();

cViewFont.DeleteObject();
if(cViewFont.CreateFontIndirect(&lfUnit))
SetFont(&cViewFont);
}
cViewFont.CreateFontIndirect(&lfUnit);
LOGFONT 構造体で与えられた特性で CFont オブジェクトを初期化します。この関数では、Fontの属性を確保する際に動的なメモリを使用するので、失敗する可能性を秘めています。失敗するとこの関数はfalseを返すので、それをifで判定しています。
SetFont(&cViewFont);
フォントができたらこれをViewのフォントに設定し、再描画します。
これで実行すると、SystemフォントからVC++でおなじみのフォントに変更できるでしょう。
10.フォント変更ダイアログを使おう
このサイトでも何回か出てきているコモンダイアログ。コモンダイアログとはwindowsで通常使われているようなファイルのオープン・クローズ、カラー、フォルダなどのダイアログですが、フォントの変更のダイアログも実はコモンダイアログとして用意されているので、実装は非常に簡単です。
1.メニューにフォント変更を追加する。
メニューの[表示]の中に、以下の図のようにしてフォントの変更を追加する。
2.クラスウィザードを立ち上げID_VIEW_FONTに対するコマンドを作る。
関数名はOnViewFont()とでもしておいたほうが無難ですね。ちなみにコマンドの作り方が分からない場合には(是非とも分かっていてほしいのですが)、ココを参照ください。
3.次のコードを記述する
フォントの変更
void CMyHtmlView::OnViewFont(){
LOGFONT lf;
cViewFont.GetLogFont(&lf);
//フォントダイアログの作成
CFontDialog cDlg(&lf, CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT);
//ダイアログのオープン
if (cDlg.DoModal() != IDOK){return ;}
//現在のフォントの削除
cViewFont.DeleteObject();
//フォントの作成
if(cViewFont.CreateFontIndirect(&lf))
SetFont(&cViewFont);
}
では解説していきましょう。
LOGFONT lf;
LOGFONT構造体変数を定義します。
cViewFont.GetLogFont(&lf);
現在のフォントの属性を、先ほど定義したLOGFONT変数に書き込みます。なぜこのような操作をするかは、次の命令に関係があります。
CFontDialog cDlg(&lf, CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT);
フォントダイアログを作成します。このとき、現在のフォントのLOGFONT構造体を初期選択しているように設定するために、先ほどの操作が必要だったのです。ちなみにLOGFONT変数lfは、ダイアログの初期選択に使うほかに、ダイアログで設定された内容が書き込まれるのでlfは参照渡しする必要があります。
if (cDlg.DoModal() != IDOK){return ;}
作成したダイアログをモーダルモードとして開きます。
cViewFont.DeleteObject();
現在のフォントオブジェクトを初期化します。CreateFontIndirect関数を使ってフォントを作るときには、動的にメモリを確保してフォント属性を保持するので、メモリを初期化する必要があるのです。
if(cViewFont.CreateFontIndirect(&lf))
SetFont(&cViewFont);
先ほど設定された内容が入っているLOGFONT変数lfを使ってフォントを作成します。フォントの作成に成功したならば、Viewにこのフォントを割り当て、再描画します。
実行すると、フォント変更ダイアログでフォントの変更が可能になっているはずです。

[Next]
[Previous]
[Home]