|
フォント選択ダイアログ
今回はコモンダイアログの続きです。次のようなフォント選択のダイアログを作ってみましょう。

では、さっそくプロジェクトを作成し、次のようなダイアログを作ります。

"フォント選択"ボタンが押されると、フォント選択ダイアログを表示し、スタティックテキストの文字列を、指定したフォントで描画します。
スタティックテキストはウィンドウとして操作するので、コントロール型のDDX変数を追加します。カテゴリにControlを選択し、変数の種類にCStaticを選択します。

ボタンにはBN_CLICKEDのメッセージハンドラを追加します。(「ボタンの基本」等を見てください。)
フォント情報はCFontクラスのオブジェクトが保持します。このオブジェクトは、そのフォントを使っているコントロールやウィンドウが存在している間は、ずっと破棄されずに存在している必要があります。なので、ローカル変数としては取らずに、ダイアログクラスのメンバ変数としてCFontクラスを追加します。

では、コードを実装していきましょう。"フォント選択"ボタンが押されたときのイベントハンドラです。
// "フォント選択"ボタン押下
void CFontSelectDlg::OnBnClickedFont()
{
CFont *oldFontP = NULL;
LOGFONT logFont;
int err = 0;
// 現在のフォントを取得
if (!err) if ((oldFontP = m_xcStatic.GetFont()) == NULL) err = 1;
if (!err) if (!oldFontP->GetLogFont(&logFont)) err = 1;
if (!err)
{
CFontDialog fontDlg(&logFont);
// フォント選択ダイアログ表示
if (fontDlg.DoModal() == IDOK)
{
// 選択されたフォントを取得
if (!err) fontDlg.GetCurrentFont(&logFont);
// 新しいフォントを作成
if (!err)
{
if (m_font.GetSafeHandle())
if (!m_font.DeleteObject()) err = 1;
}
if (!err) if (!m_font.CreateFontIndirect(&logFont)) err = 1;
// 新しいフォントを設定
if (!err) m_xcStatic.SetFont(&m_font);
}
}
return;
} |
まず、現在のフォントをスタティックテキストから取得します。CStaticはCWndの派生クラスなので、CWnd::GetFont()で取得します。ここで取得できるCFontオブジェクトは、ダイアログの各コントロールで共通に使われているものなので、直接操作してはいけません。
フォント選択のダイアログは、CFontDialogクラスを使います。コンストラクタにLOGFONT構造体のポインタを渡すと、初期状態でそのフォントが選択された状態になります。
選択されたフォントを取得するには、CFontDialog::GetCurrentFont()関数を使います。ここで取得したLOGFONT構造体をもとに、CFont::CreateFontIndirect()関数で新しいフォントを作成します。
最後にCWnd::SetFont()関数で、スタティックテキストにフォントを設定します。
では、ビルドして実行してみましょう。フォント選択ダイアログで任意のフォントを選択すると、スタティックテキストのフォントが変わります。


|