ホーム ATL/WTL
フォント選択ダイアログ
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2007/04/08
PR
 WTLではコモンダイアログのフォント選択ダイアログを CFontDialogImplというクラステンプレートでカプセル化しています。 これはATLのCDialogImplクラステンプレートのように基底クラスとしてのみ使用します。 atldlgs.hヘッダではCFontDialogImplから派生したCFontDialogクラスが定義されています。

// atldlgs.h
class CFontDialog : public CFontDialogImpl<CFontDialog>
{
    ...
    ...
			

 WTLのCFontDialogクラスは、MFCの同名のクラスとほぼ同じメンバ関数を用意しています。 以下に示すのは、CFontDialogクラスを使用する例です。


CFontDialog dlg;

if(dlg.DoModal() == IDOK){
    CString strMsg;
    strMsg.Format(_T("フォント名:%s\nサイズ:%dpt"),
        dlg.GetFaceName(), dlg.GetSize() / 10);
    MessageBox(strMsg);
}
			

CFontDialogクラスのコンストラクタ引数はすべて省略できます。 引数は順に、フォント選択ダイアログの初期状態を設定するためのLOGFONT構造体へのポインタ、 フラグ、プリンタデバイスコンテキスト、親ウィンドウのハンドルを指定できます。

フォント選択ダイアログを表示するためにはCFontDialogクラスのメンバ関数であるDoModal()を呼び出します。 [OK]ボタンを押してフォント選択ダイアログを閉じた場合は、 戻り値としてIDOKが、 [キャンセル]ボタンを押して閉じた場合はIDCANCELが返ります。

戻り値がIDOKの場合は、CFontDialogクラスのメンバ変数である m_cfにフォント情報が設定されます。 CFontDialogクラスはこの情報を取得するためのメンバ関数を用意しています。

CFontDialogImplの派生クラスにメッセージマップを用意することによって、 フォント選択ダイアログの動作をカスタマイズすることができます。

次に示すのは、CFontDialogImplの派生クラスにWM_INITDIALOGメッセージハンドラを用意して、 独自のフォント選択ダイアログを作成する例です。 プロジェクトにCustomDlg.hというヘッダファイルを追加し、そこにCCustomDlgというクラスを定義します。 このフォント選択ダイアログには[ヘルプ]ボタンが追加され、親ウィンドウの中央に表示されます。


// CustomDlg.h
#pragma once

class CCustomDlg : public CFontDialogImpl<CCustomDlg>
{
public:
    UINT m_uHelpMsg;  // [ヘルプ]ボタン用メッセージID

    // コンストラクタ
    CCustomDlg(LPLOGFONT lplfInitial = NULL,
        DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
        HDC hDCPrinter = NULL)
        : CFontDialogImpl<CCustomDlg>(lplfInitial, dwFlags, hDCPrinter), m_uHelpMsg(0)
    {
        // [ヘルプ]ボタンを表示するためにCF_SHOWHELPフラグ追加
        m_cf.Flags |= CF_SHOWHELP;
    }

    BEGIN_MSG_MAP_EX(CCustomDlg)
        MSG_WM_INITDIALOG(OnInitDialog)
        MESSAGE_HANDLER_EX(m_uHelpMsg, OnHelp)
    END_MSG_MAP()

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){
        m_cf.hwndOwner = m_hWnd;

        // [ヘルプ]ボタン用メッセージを登録
        m_uHelpMsg = RegisterWindowMessage(HELPMSGSTRING);

        CenterWindow();

        return TRUE;
    }

    LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam){
        MessageBox(_T("ヘルプボタンを押しました。"));
        return 0;
    }
};
			

CCustomDlgクラスのコンストラクタ引数は、 CFontDialogクラスのコンストラクタ引数を参考にしています。 コンストラクタでは、フォント選択ダイアログに[ヘルプ]ボタンを追加するために CF_SHOWHELPフラグを追加します。 メッセージマップマクロにはBEGIN_MSG_MAP_EXを使用する必要があります。 WM_INITDIALOGメッセージハンドラでは、 m_cf.hwndOwnerに[ヘルプ]ボタン用メッセージを受信するウィンドウハンドル (つまりフォント選択ダイアログ自身のハンドル)を設定し、 [ヘルプ]ボタン用のメッセージを登録します。 また、CenterWindow()を呼び出してダイアログを中央に表示します。 OnHelp()は[ヘルプ]ボタンを押した時に呼び出されます。 今回の例ではメッセージボックスを表示します。

 次に示すのは、CCustomDlgクラスを使用する例です。

プロジェクトファイル ダウンロード
// stdafx.h
#pragma once

#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>

#include <atlcrack.h>
#include <atlmisc.h>
#include <atldlgs.h>  // コモンダイアログ用クラスを使用するため
			

// MainDlg.h
#pragma once

class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
    enum { IDD = IDD_MAINDLG };

    BEGIN_MSG_MAP(CMainDlg)
        MSG_WM_INITDIALOG(OnInitDialog)
        COMMAND_ID_HANDLER_EX(IDC_BUTTON_OPENDLG, OnButtonOpenDlg)
        COMMAND_ID_HANDLER_EX(IDOK, OnOK)
        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
    END_MSG_MAP()

    BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
        // スクリーンの中央に配置
        CenterWindow();

        // 大きいアイコン設定
        HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
            ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));
        SetIcon(hIcon, TRUE);
        
        // 小さいアイコン設定
        HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
            ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));
        SetIcon(hIconSmall, FALSE);

        return TRUE;
    }

    void OnButtonOpenDlg(UINT uNotifyCode, int nID, CWindow wndCtl){
        CCustomDlg dlg;

        if(dlg.DoModal() == IDOK){
            CString strMsg;
            strMsg.Format(_T("フォント名:%s\nサイズ:%dpt"),
                dlg.GetFaceName(), dlg.GetSize() / 10);
            MessageBox(strMsg);
        }
    }

    void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl){
        EndDialog(nID);
    }

    void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl){
        EndDialog(nID);
    }
};
			

// SampleProject.cpp
#include "stdafx.h"
#include "resource.h"
#include "CustomDlg.h"
#include "MainDlg.h"

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance, 
    HINSTANCE /*hPrevInstance*/, LPTSTR /*lpstrCmdLine*/, int /*nCmdShow*/)
{
    HRESULT hRes = ::CoInitialize(NULL);
    ATLASSERT(SUCCEEDED(hRes));

    ::DefWindowProc(NULL, 0, 0, 0L);

    AtlInitCommonControls(ICC_BAR_CLASSES);

    hRes = _Module.Init(NULL, hInstance);
    ATLASSERT(SUCCEEDED(hRes));

    CMainDlg dlg;
    int nRet = (int) dlg.DoModal();

    _Module.Term();
    ::CoUninitialize();

    return nRet;
}
			

 まず、リソースを作成します。ダイアログにボタンコントロールを配置し、 [ID]と[Caption]を次のように設定します。

コントロール名 ID Caption
ボタン IDC_BUTTON_OPENDLG ダイアログを開く

 次に、stdafx.hヘッダでは、コモンダイアログを使用するためにatldlgs.hヘッダをインクルードします。

 CMainDlgクラスでは、リソースIDがIDC_BUTTON_OPENDLGWM_COMMANDメッセージハンドラとして OnButtonOpenDlg()を追加します。 このハンドラ関数ではCCustomDlgクラスのインスタンスを作成し、 DoModal()を呼び出して独自のフォント選択ダイアログを表示します。

 最後に、SampleProject.cppファイルでMainDlg.hヘッダの前にCustomDlg.hヘッダをインクルードします。

リッチエディットフォント選択ダイアログ
 CFontDialogクラスでは、フォント選択ダイアログの初期状態を設定したり、 GetCurrentFont()を呼び出してフォント選択ダイアログで選択した項目を取得するためにLOGFONT構造体を使用します。 CRichEditFontDialogクラスを使うと、 そのような用途のためにリッチエディットコントロールの書式情報を表すCHARFORMAT構造体を使用できます。

 CRichEditFontDialogクラスの基底クラスであるCRichEditFontDialogImplCFontDialogImplから派生しています。 atldlgs.hヘッダでは次のように定義されています。

// atldlgs.h
template <class T>
class ATL_NO_VTABLE CRichEditFontDialogImpl : public CFontDialogImpl< T >
{
    ...
    ...
};

class CRichEditFontDialog : public CRichEditFontDialogImpl<CRichEditFontDialog>
{
    ...
    ...
};
			

 以下に示すのは、CRichEditFontDialogクラスを使用する例です。

プロジェクトファイル ダウンロード
// 初期状態で10ポイントで赤のArialフォントを選択
CHARFORMAT cfset = {sizeof(CHARFORMAT)};
cfset.dwMask = CFM_FACE | CFM_SIZE | CFM_COLOR; // 設定する項目を指定
lstrcpy(cfset.szFaceName, _T("Arial"));
cfset.yHeight = 10 * 20;
cfset.crTextColor = RGB(255, 0, 0);

CRichEditFontDialog dlg(cfset, CF_SCREENFONTS | CF_EFFECTS);

if(dlg.DoModal() == IDOK){
    CHARFORMAT cfget;
    dlg.GetCharFormat(cfget);

    CString strMsg;
    strMsg.Format(_T("フォント名:%s\nサイズ:%dpt"),
        cfget.szFaceName, cfget.yHeight / 20);
    MessageBox(strMsg);
}
			

CRichEditFontDialogクラスを使用するためには、 atldlgs.hヘッダの前にrichedit.hヘッダをインクルードする必要があります。 なお、atlctrls.hヘッダをインクルードすると、自動的にrichedit.hヘッダもインクルードされます。

CRichEditFontDialogクラスのコンストラクタの第1引数にはCHARFORMAT構造体の参照を指定します。 残りの引数は省略可能で、順にフラグ、プリンタデバイスコンテキスト、親ウィンドウのハンドルです。

リッチエディットフォント選択ダイアログで指定した書式情報を取得するためには、 GetCharFormat()を呼び出します。 なお、CRichEditFontDialogクラスの基底クラスにはCFontDialogImplがあるため、 書式情報を取得するためにGetFaceName()GetSize()などのメンバ関数を使うこともできます。